До сих пор мы не заостряли внимание на том, что в обмене данными у нас участвует справочник Склады, содержащий предопределенные элементы с именами Основной и Розничный. Однако нужно иметь в виду, что при обмене предопределенными данными в нераспределенной информационной базе могут возникнуть проблемы.
Дело в том, что при создании справочников и других объектов конфигурации, которые могут содержать предопределенные элементы, свойство Обновление предопределенных данных для этих объектов стандартно устанавливается в значение Авто. Это приводит к тому, что при реструктуризации базы данных или при первом обращении к таблице, хранящей данных объекта конфигурации, создаются или обновляются элементы данных, связанных по имени с предопределенными элементами данных в конфигурации.
В нашем случае при открытии списка складов в базе оптового и розничного складов будут автоматически созданы элементы справочника Склады, связанные с предопределенными элементами справочника с именами Основной и Розничный. При этом свойство ИмяПредопределенныхДанных этих элементов справочника будет установлено в значение Основной и Розничный. Изменить эту связь можно только с помощью встроенного языка.
Но затем при загрузке данных из центральной базы в справочник Склады будут добавлены еще две записи, связанные с этими же предопределенными элементами. В результате элементы справочника продублируются из-за того, что данные из центральной базы будут восприняты как новые, так как у них будут другие ссылки.
В дальнейшем это приведет к ошибке, так как в системе не может быть двух объектов, связанных с одинаковым предопределенным элементом. Разработчик должен это отслеживать и не допускать такой ситуации. Например, можно сделать одну из баз ведущей в части обновления предопределенных данных, а в других – это обновление запретить.
Режим обновления предопределенных данных можно установить для конкретного объекта конфигурации с помощью метода встроенного языка УстановитьОбновлениеПредопределенныхДанных(). Либо можно установить свойство объекта конфигурации Обновление предопределенных данных в конфигураторе. А также это можно сделать для всей информационной базы в целом с помощью метода УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы().
Свойство объектов ОбновлениеПредопределенныхДанных может принимать следующие значения:
Возможность создания и обновления предопределенных данных определяется последовательным анализом режима обновления установленного в данных объекта конфигурации, или при конфигурировании этого объекта, или для всей информационной базы до тех пор, пока не будет обнаружено значение, отличное от значения Авто.
Сказанное касается только нераспределенных баз данных. Если это периферийный узел РИБ, то предопределенные данные не будут обновлены. Если проверка выполняется для центрального узла РИБ, обновление предопределенных данных будет выполнено.
Самое простое – это запретить обновление предопределенных данных справочника складов в конфигураторе. Для этого нужно открыть конфигурацию оптового или розничного склада и в окне редактирования свойств справочника Склады на закладке Прочее установить свойство Обновление предопределенных данных в значение Не обновлять автоматически (рис. 3.31).
Рис. 3.31. Редактирование свойств справочника «Склады»
Но мы этого делать не будем, а рассмотрим более универсальный вариант решения этой проблемы – на уровне всей информационной базы в целом.
Добавим в конфигурацию константу ИспользоватьОбновлениеПредопределенныхДанных и поместим ее в общую форму констант НастройкиИнформационнойБазы. В модуле менеджера значения этой константы поместим обработчик события ПриЗаписи и заполним его следующим образом (листинг 3.74).
Листинг 3.74. Обработчик события «ПриЗаписи»
Процедура ПриЗаписи(Отказ)
Если Значение = Истина Тогда
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Иначе
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);
КонецЕсли;
КонецПроцедуры
Запустим «1С:Предприятие» и установим флажок использования обновления предопределенных данных в форме общих настроек центральной базы (рис. 3.32).
Рис. 3.32. Установка настроек информационной базы
Создадим снова базу оптового и/или розничного склада из конфигурации, откроем окно настроек и запишем этот флажок в снятом состоянии.
Затем откроем список складов. Он будет пустым, так как при записи настроек для всей информационной базы мы установили режим обновления предопределенных данных в значение Не обновлять автоматически.
Теперь выполним чтение начальных данных от центральной базы. После этого в списке складов появятся две записи, полученные из центральной базы, связанные с предопределенными элементами справочника с именами Основной и Розничный. И это правильно.
Как уже говорилось, автоматическое создание предопределенных данных в дочерних узлах распределенной информационной базы не производится. Но следует иметь в виду, что в случае отмены назначения главного узла (например, для выполнения каких-либо специальных действий) такая информационная база не будет считаться периферийной. В связи с этим при первом запуске такой информационной базы в режиме 1С:Предприятие режим создания или обновления предопределенных элементов может быть определен как Обновлять автоматически. Чтобы избежать этого, можно воспользоваться параметром командной строки /SetPredefinedDataUpdate или использовать метод глобального контекста УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы().