Куперс

Бухучет и анализ

Предопределенный элемент справочника

1С:Предприятие 8.2 /
Разработчикам /
Платформа, механизмы и технологии

Общие сведения

Работа с разделителями

Для некоторых объектов метаданных в платформе » 1С:Предприятие 8″ есть возможность задавать в конфигурации предопределенные элементы , для которых в информационной базе будут автоматически создаваться объекты с заданными значениями. В данной статье рассматриваются некоторые особенности их реализации и работы с ними.

Общие сведения

Объекты данных обладают свойством ИмяПредопределенныхДанных, с помощью которого можно управлять их связью с метаданными. Объекты, у которых данное свойство заполнено, являются предопределенными.

Данное свойство может принимать следующие значения:

  • Имя предопределенного элемента из метаданных.
  • Пустое значение .
  • Специальное имя, для идентификации проблемных объектов. Специальное имя начинается с символа #. Его можно установить только в режиме загрузки обмена данными . Режим загрузки нужно включать до присвоения специального имени предопределенного.

Если объекту данных установить пустое значение свойства , то он станет обычным, не предопределенным, объектом.

Если объекту установить имя предопределенного элемента из метаданных, то он станет предопределенным элементом, связанным с метаданными. В пределах одной области информационной базы допустимо использование только одного объекта данных, связанных с конкретным предопределенным элементом метаданных.

В режиме загрузки уникальность предопределенного элемента в пределах области информационной базы не проверяется.

Специальное имя предопределенного является особенностью, которую следует избегать. Такое имя предопределенных данных характерно для удаленных из метаданных предопределенных элементов, при отключенном автоматическом обновлении предопределенных.

Предопределенные элементы можно редактировать , удалять, помечать на удаление. Имеются специальные права для управления ограничениями на удаление предопределенных.

Рассмотрим следующий пример. В некоторой информационной базе в плане счетов находится элемент данных с кодом А. В какой-то момент решили добавить предопределенный элемент А с кодом А. При реструктуризации в базе данных он будет создан, но существующие ссылки будут ссылаться на существовавший ранее объект данных. Выполнив следующую последовательность команд, можно сделать существующий объект предопределенным:

ПланыСчетов.ПланСчетовПример.А.ПолучитьОбъект().Удалить(); Ссылка = ПланыСчетов.ПланСчетовПример.НайтиПоКоду(«А»); Если НЕ Ссылка.Пустая() Тогда Объект = Ссылка.ПолучитьОбъект(); Объект.ИмяПредопределенныхДанных = «А»; Объект.Записать(); КонецЕсли;

В результате при обращении к предопределенному элементу А будет возвращен существовавший ранее объект данных А.

Свойство ИмяПредопределенныхДанных доступно в запросах (поле выбора и в условиях), в формах, таблицах и др. Данное свойство обладает особенностями сортировки: сортировка выполняется по внутреннему ключу, а не по строке.

Работа с разделителями

Предопределенные элементы могут использоваться в информационных базах, имеющих общие реквизиты, разделяющие информационную базу в режиме Независимо или Независимо и совместно.

Рассмотрим работы с предопределенными элементами с различными режимами разделения на примере справочника.

Вариант 1. Общий реквизит разделяет информационную базу в режиме Независимо. При получении ссылки на предопределенный элемент выполняется запрос к данным таблицы. Поэтому перед получением ссылки на предопределенный элемент необходимо, чтобы в сеансе было установлено значение и включено использование реквизита, являющегося разделителем. При обращении к данным таблицы предопределенные элементы будут созданы, за исключением случаев:

  • Предопределенные элементы уже были созданы (проинициализированы) ранее.
  • Отключено автоматическое обновление предопределенных данных.

Вариант 2. Общий реквизит разделяет информационную базу в режиме Независимо и совместно, использование реквизита выключено в текущем сеансе работы. При попытке получить ссылку на предопределенный элемент вызывается исключение. При просмотре данных будут отображены все существующие записи таблицы. Независимо от текущего режима обновления предопределенных данных предопределенные данные создаваться не будут, даже если их нет.

Вариант 3. Общий реквизит разделяет информационную базу в режиме Независимо и совместно, использование реквизиты включено в текущем сеансе работы. При попытке получить ссылку на предопределенный элемент будет возвращена ссылка на предопределенный элемент из текущей области данных. Если запрашиваемая ссылка отсутствует (например, удалена пользователем), то вызывается исключение. При обращении к данным таблицы предопределенные элементы будут созданы, за исключением случаев:

  • Предопределенные элементы уже были созданы (проинициализированы) ранее.
  • Отключено автоматическое обновление предопределенных данных.

Внутренний идентификатор

Предопределенные элементы имеют уникальный идентификатор. Уникальность идентификатора проверяется в пределах независимых областей информационной базы данных, по аналогии с другими объектами данных.

Связь предопределенного элемента с метаданными осуществляется через свойство ИмяПредопределенныхДанных.

Обновление конфигурации базы данных

При отключении режима совместимости 8.3.2 или ниже:

  • Изменяется структура таблиц. Добавляются новые служебные таблицы. Это требует монопольного доступа к информационной базе
  • Существующие предопределенные элементы модифицируются, внутренние идентификаторы не изменяются. Такие элементы могут безболезненно возвращены к режиму совместимости 8.3.2 или ниже.
  • Включаются новые возможности по работе с предопределенными элементами.

При любом обновлении конфигурации с отключенным режимом совместимости (данные действия выполняются только если режим обновления предопределенных элементов требует обновления предопределенных данных):

  • Создаются новые предопределенные элементы, которые были добавлены по отношению к конфигурации базы данных. Например: Если в конфигурации базы данных есть предопределенный элемент с именем А и добавили предопределенный элемент с именем Б в конфигурации будет создан предопределенный элемент с именем Б. Предопределенный элемент с именем А не будет создан, даже если он был удален пользователем из данных. Предопределенные элементы создаются только в тех областях, которые были проинициализированы: либо пользователь уже обращался к предопределенным данным из этой области, либо с помощью специального метода языка ИнициализироватьПредопределенныеДанные().
  • Удаленные по отношению к конфигурации базы данных предопределенные элементы помечаются на удаление и у них сбрасывается признак предопределенного. Например: в конфигурации базы данных имеются элементы А и Б и в конфигурации удален элемент Б. в данных при реструктуризации объекты данных, связанные с элементом Б (если они есть) будут помечены на удаление и у него будет сброшен признак предопределенного. Свойство ИмяПредопределенныхДанных будет пустым.
  • Модифицированные в конфигурации предопределенные элементы, модифицируются в данных, если они не редактировались пользователем.

При включении режима совместимости:

  • Изменяется структура таблиц. Удаляются служебные таблицы. Это требует монопольного доступа к ИБ
  • Существующие предопределенные элементы проверяются на возможность возврата к режиму совместимости 8.3.2 или ниже. Если возврат невозможен – в конфигураторе выводится соответствующее предупреждение. Несовместимые предопределенные элементы будут помечены на удаление и будет сброшен признак предопределенного элемента. Недостающие предопределенные элементы будут созданы.
  • Выключаются новые возможности по работе с предопределенными элементами.

Поведение идентификаторов предопределенных элементов при копировании и объединении конфигураций

В отличие от идентификаторов объектов метаданных, идентификаторы предопределенных элементов при копировании не изменяются. Таким образом, два различных объекта метаданных могут иметь предопределенные элементы с одинаковыми идентификаторами.

Теперь рассмотрим, как описанные принципы влияют на поведение предопределенных элементов в различных механизмах платформы » 1С:Предприятие 8″.

Объединение конфигураций

При объединении конфигураций сопоставление между предопределенными элементами выполняется только по идентификатору, а не по имени или коду. Это следует учитывать при выборе правила объединения свойства Предопределенные данные.

Рассмотрим следующую ситуацию. Вы разрабатываете конфигурацию и устанавливаете ее у заказчика. В процессе настройки возникает необходимость срочной доработки, в частности, добавления предопределенного элемента. Затем в своей основной разрабатываемой конфигурации вы «синхронизируете» изменения, добавляя такой же элемент, осуществляете еще какие-то доработки и приносите новую версию к заказчику.

Если при выполнении объединения конфигураций оставить правило по умолчанию — Взять из конфигурации поставщика, то в результате останется только «ваша» версия элемента. При выполнении обновления конфигурации информационной базы, как было описано выше, будет создан новый объект, а старый помечен на удаление.

Однако на старый объект могут быть заведены ссылки в других объектах. Для исправления этой ситуации следует найти все ссылки в базе данных на «старый» объект. Это можно сделать с помощью командыПоиск ссылок на объекты или в процессе контроля, при выполнении команды Удаление помеченных объектов. Найденные ссылки следует исправить на ссылки на «новый» объект, после чего «старый» удалить.

Если ссылок много, а дальнейшие объединения с другой конфигурацией не предполагаются (в описываемом сценарии это не так, но, может, вы просто хотите однократно добавить в конфигурацию некоторые объекты из другой), можно поступить иначе. При объединении для предопределенных данных установить правило Объединять с приоритетом… (приоритет будет влиять на порядок и место в иерархии предопределенных элементов с одинаковым идентификатором). После выполнения объединения в конфигурации будут присутствовать оба элемента, и старый и новый. Новый можно удалить (до выполнения обновления конфигурации базы данных). Главное, только их не перепутать. Для этого перед сравнением / объединением можно в основной конфигурации временно переименовать элемент, а потом вернуть обратно. При таком алгоритме, предопределенные элементы конфигурации из файла, которые не имеют аналогов, будут добавлены, а «конфликтные» нет.

Наконец, следует напомнить, что если из файловой конфигурации новых предопределенных данных добавлять не надо, то для свойства Предопределенные данные можно отключить пометку (флажок) объединения. При этом объединение конфигураций в целом будет выполнено, а предопределенные данные останутся старыми.

Однако различия в предопределенных данных не всегда приводят к подобным проблемам. Рассмотрим другой возможный сценарий. Вы выгружаете конфигурацию в файл, затем редактируете ее где-то в стороне, например, дома. В процессе редактирования добавляются новые предопределенные элементы и, возможно, удаляются или редактируются существующие. Затем выполняется объединение новой версии с оригинальной конфигурацией. В этом случае можно оставить правило объединения Взять из файла. Как уже отмечалось, в процессе перемещения между различными конфигурациями идентификаторы элементов не изменяются, и все старые элементы вернуться со своими оригинальными идентификаторами.

Режимы обновления предопределенных данных

С целью более удобной организации обмена предопределенными данными реализован механизм управления режимами обновления предопределенных данных. Режим обновления предопределенных задается отдельно для каждого объекта метаданных.

Режим обновления можно задать:

  • В метаданных, с помощью свойства ОбновлениеПредопределенныхДанных.
  • В данных, с помощью метода УстановитьОбновлениеПредопределенныхДанных.

Итоговое значение, которое будет определять необходимость создавать предопределенные данные при реструктуризации, при первом обращении к таблице или при инициализации предопределенных данных информационной базы, вычисляется по следующим правилам:

  • Сначала значения Авто в метаданных и в данных подменяются ОбновлятьАвтоматически в центральном узле и в НеОбновлятьАвтоматически в периферийных узлах.
  • Затем по условию <Значение в данных> И <Значение в метаданных> определяется необходимость обновлять предопределенные.

Пример 1:

Конфигурация центрального узла:

Значение в метаданных – ОбновлятьАвтоматически.

Значение в данных – Авто.

Значение в данных подменяется на ОбновлятьАвтоматически.

ОбновлятьАвтоматически ИОбновлятьАвтоматически = ОбновлятьАвтоматически.

Таким образом, для этого объекта метаданных будет выполняться автоматическое обновление предопределенных данных.

Пример 2:

Конфигурация периферийного узла:

Значение в метаданных – Авто.

Значение в данных – ОбновлятьАвтоматически.

Значение в метаданных подменяется на НеОбновлятьАвтоматически.

НеОбновлятьАвтоматически И ОбновлятьАвтоматически = НеОбновлятьАвтоматически.

Таким образом, для этого объекта метаданных не будет выполняться автоматическое обновление предопределенных.

Данные режимы позволяют установить дополнительные правила для удобного обмена предопределенными данными.

Если итоговый режим равен ОбновлятьАвтоматически:

  • Предопределенные элементы обрабатываются при реструктуризации.
  • Предопределенные элементы создаются при первом обращении к таблице, если они не создавались до этого.
  • Предопределенные элементы создаются при вызове метода ИнициализироватьПредопределенныеДанные(), если они не создавались до этого.

Если итоговый режим равен НеОбновлятьАвтоматически:

  • Предопределенные элементы не обрабатываются при реструктуризации
  • Предопределенные элементы не создаются при первом обращении к таблице.
  • Предопределенные элементы не создаются при вызове метода ИнициализироватьПредопределенныеДанные.

Обмен данными

Предопределенные объекты данных передаются по аналогии с другими объектами данных.

Рассмотрим следующий сценарий. В обмене участвуют две информационные базы, имеющие независимые (разные) конфигурации. В этих конфигурациях есть справочники, между которыми установлена связь. В обеих конфигурациях мы добавили предопределенный элемент, имеющий идентичное имя. В конфигурации 1 обновление предопределенных для этих справочников выполняется автоматически, а в конфигурации 2 автоматическое обновление предопределенных не выполняется. При обновлении конфигурации (при первом обращении или при инициализации информационной базы) предопределенные элементы будут созданы в конфигурации 1 и не будут созданы в конфигурации 2. После формирования обменного пакета из конфигурации 1 в конфигурацию 2 предопределенные элементы передаются вместе с другими объектами данных и автоматически связываются по имени предопределенного.

Ошибка Переменная не определена в 1С 8.3 указывает на то, что программа не может получить нужную информацию в исполняемом программном коде. Это может быть связано с обновлением или доработкой программы. Если стандартный набор действий при исправлении ошибок не помог:

  • чистка кеша;
  • тестирование и исправление информационной базы;
  • просмотр зарегистрированных ошибок на сайте 1С,

придется разбираться с местом возникновения ошибки в 1С самостоятельно.

БухЭксперт8 подготовил 3 примера получения и исправления ошибки:

  • в доработанном программном коде;
  • при выводе печатной формы;
  • при исполнении кода на Клиенте.

Ошибка в доработанном программном коде

В форму типового отчета Движение товаров программист добавил поле Склад. Список выбора значений в это поле ограничен. При открытии отчета появляется ошибка:

В сообщении об ошибке указано место возникновения ошибки — строка 919 в модуле формы. Для исправления ошибки необходимо выполнить следующие действия:

  1. Нажмите кнопку Подробно в форме сообщения об ошибке.
    В окне Обнаружены ошибки программа укажет:
    • номер неправильной строки кода;
    • исполняемую команду, которая привела к ошибке. Иногда подробной информации в окне Обнаружены ошибки достаточно для понимания причин ее возникновения, но не всегда. В большинстве случаев требуется перейти в место возникновения ошибки и проанализировать используемые в команде данные.
  2. Для перехода в место ошибки нажмите кнопку Конфигуратор.
    В Конфирураторе курсор автоматически установится на строке программного кода с ошибкой. Необходимо проверить используемые командой данные. В данном примере ошибка сигнализирует, что переменной ОсновнойСклад не задано значение: при добавлении в список складов программа не понимает, какой склад требуется добавить.
  3. Исправьте ошибку.
    Укажите нужное значение переменной в программном коде, например:
    • ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию(«Основной склад»);
    • ОсновнойСклад = Справочники.Склады.ОсновнойСклад.
      Синтаксис Справочники.Склады.ОсновнойСклад используется только для предопределенного склада с именем ОсновнойСклад:
  4. Сохраните изменения и обновите информационную базу.
  5. Проверьте работу 1С после исправления ошибки.

После исправления отчет открывается без ошибки, а при выборе складов устанавливается нужное значение Основной склад.

Ошибка вывода печатной формы

Для вывода в печатную форму накладной данных об ответственном менеджере, оформившем документ поступления, программист внес изменения в макет ПФ_MXL_Накладная и программный код.

В макет документа добавлена область Подвал:

В программном коде дописан вывод данных области Подвал:

После доработки программы при попытке вывода накладной на печать 1С выдает ошибку:

Информация в окне сообщения об ошибке указывает, что в Модуле менеджера документа ПоступлениеТоваровУслуг не определено значение переменной Ответственный. Для исправления ошибки:

  1. Перейдите в Конфигуратор. В Модуле менеджера документа ПоступлениеТоваровУслуг перейдите на строку 4804.
  2. Укажите для вывода в печатную форму поля Ответственный — текущего пользователя, используя специальную команду 1С:
    • Пользователи.ТекущийПользователь().
  3. Сохраните изменения и обновите информационную базу.
  4. Перейдите в пользовательский режим для проверки выполненных изменений.

После исправления программного кода накладная сформируется без ошибки.

Ошибка исполнения кода на Клиенте

С переходом на управляемые формы в Бухгалтерия 3.0 работы программистам прибавилось.

Язык программирования стал сложнее. Часть команд теперь могут выполняться только на стороне клиента — это, условно говоря, компьютер пользователя, который посылает запросы на исполнение операций серверу. Сервер обрабатывает все поступившие запросы и отсылает обратно клиенту результат обработки данных.

Все это привело к тому, что в 1С команды делятся на исполняемые &НаСервере и &НаКлиенте. И при написании программного кода нужно это учитывать, иначе программа не сможет выполнить заданную операцию. При работе с переменными при написании программного кода важно понимать:

  • &НаКлиенте — переменные существуют только на время клиентского вызова;
  • &НаСервере— переменные существуют только на время серверного вызова.

Разделение команд в программном коде не зависит от того, используете ли вы файловую или клиент-серверную 1С. Разграничение должно четко исполняться, иначе будут возникать ошибки, одну из которых БухЭксперт8 разберет на примере.

При доработке программного кода программист использовал операцию получения данных склада &НаКлиенте в процедуре ПриОткрытии.

При сохранении изменений 1С сообщила об ошибке Переменная не определена (Справочники) при определении значения склада:

  • «?»Справочники.Склады.НайтиПоКоду(«»00-000002»).

Ошибка связана с тем, что данная операция исполняется только на сервере, т. е. &НаСервере. И несмотря на то, что сама команда исполнения корректна, ошибка будет формироваться до тех пор, пока ее не перенесут в область команд исполнения &НаСервере, например так:

Теперь сохранение изменений пройдет без ошибки.

Усложнение языка программирования 1С требует от разработчика более глубокого подхода к вносимым изменениям в программу. Недостаточно просто знать синтаксис команды, важно еще правильно задать область исполнения команды в режиме управляемых форм.

См. также:

  • Большое количество забивается решеткой
  • Печатная форма недоступна 1С 8.3 при вызове внешней печатной формы
  • Значение поля номер не уникально 1С 8.3: как исправить
  • У пользователя недостаточно прав на исполнение операции

Если Вы еще не подписаны:

Активировать демо-доступ бесплатно →

или

Оформить подписку на Рубрикатор →

После оформления подписки вам станут доступны все материалы по 1С Бухгалтерия, записи поддерживающих эфиров и вы сможете задавать любые вопросы по 1С.

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Печать (Ctrl+P) Предопределенные данные – это элементы прикладных объектов, которые создаются в конфигураторе и обращение к которым возможно по имени, без предварительного поиска. Предопределенные данные имеет смысл создавать в том случае, если какой-либо элемент данных будет нужен постоянно и требуется упростить обращение к этому элементу из программного кода. Например, в справочнике Товары можно завести предопределенный элемент Услуга, обращение к которому будет выглядеть следующим образом: Справочники.Товары.Услуга. Предопределенными могут быть как элементы, так и группы элементов. Группы можно создавать в тех случаях, когда предопределенные элементы создаются в иерархических объектах, например в иерархическом справочнике. Предопределенные данные могут быть созданы:
● для справочников ,
● планов счетов ,
● планов видов характеристик ,
● планов видов расчета .
После создания предопределенного элемента в конфигураторе, возможность создания или обновления связанного с ним элемента данных определяется несколькими параметрами:
● Значение свойства объекта в информационной базе. Получить и установить значение этого свойства можно в режиме «1С:Предприятие» с помощью методов ПолучитьОбновлениеПредопределенныхДанных() и УстановитьОбновлениеПредопределенныхДанных();
● Значение свойства объекта конфигурации ОбновлениеПредопределенныхДанных. Устанавливается в конфигураторе;
● Значение, установленное для всей информационной базы. Получить и установить значение этого свойства можно в режиме «1С:Предприятие» с помощью методов ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы() и
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
● Вид узла распределенной информационной базы . Значение этого параметра определяется автоматически:
● Для корневого узла и не распределенной информационной базы принимает значение Обновлять автоматически;
● Для подчиненного узла распределенной информационной базы – Не обновлять автоматически.
Каждый вышеописанный параметр может принимать одно из следующих значений (кроме параметра, описывающего вид узла распределенной информационной базы):

● Не обновлять автоматически – в этом случае система не выполняет создание или обновление элемента данных при создании или изменении предопределенных данных. Следует понимать, что если для объекта конфигурации установлено такое , то при обращении к предопределенным данным может генерироваться исключение, т. к. отсутствует элемент данных, связанный с предопределенным элементом;
● Обновлять автоматически – в этом случае система автоматически создаст (или обновит существующие) элементы данных для новых (или измененных) предопределенных данных;
● Авто – система автоматически определяет необходимость выполнения обновления.
Выполняемое действие (обновлять или не обновлять) определяется последовательным анализом вышеперечисленных параметров (в указанном порядке) до тех пор, пока не будет обнаружено значение, отличное от значения Авто. Это значение и будет определять возможность создания или обновления предопределенных элементов.
Связь элемента данных и элемента предопределенных данных осуществляется с помощью свойства ИмяПредопределенныхДанных. С помощью этого свойства имеется возможность выполнять следующие действия:
● Связывать элемент предопределенных данных с элементов данных. Для этого следует присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента данных, который надо связать с данными:

В результате этой операции, предопределенному элементу Услуга справочника Товары будет сопоставлен элемент данных с именем Услуга доставки.
При записи объекта проверяется, что в информационной базе не существует другого элемента данных с именем предопределенных данных, установленного в значение, с которым записывается элемент данных.
● «Отключить» элемент данных от элемента предопределенных данных. Для этого необходимо присвоить свойству ИмяПредопределенныхДанных
пустую строку и записать элемент:

Объект = Справочник.Товары.Услуга.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = «”;
Объект.Записать();
Если попробовать обратиться к предопределенному элементу Справочник.Товары.Услуга после выполнения вышеприведенного примера, то будет сгенерировано исключение.
Таким образом, процесс смены элемента данных, связанного с предопределенными данными, выполняется в два этапа:
● Выполняется «отключение» существующего элемента данных от предопределенного элемента;
● Выполняется связывание нового элемента данных с предопределенным элементом.
Создание элементов данных, связанных с предопределенными данными, может быть выполнено одним из трех способов:
● Автоматически, во время реструктуризации информационной базы. Это происходит в следующем случае:
● Разрешено автоматическое создание и обновление предопределенных данных;
● Предопределенные данные ранее создавались в данной области данных или информационной базе.
● Автоматически, при первом обращении к таблице, хранящей данных объекта конфигурации. Создание предопределенных элементов в этом случае
будет выполняться при условии, что создание предопределенных элементов не запрещено.
● С помощью встроенного языка, указав свойство ИмяПредопределенныхДанных при создании элемента данных. Этот способ можно использовать, если
автоматическое создание предопределенных элементов запрещено в свойствах объектов конфигурации.
Обновление данных, связанных с предопределенными, будет выполняться в том случае, если разрешено автоматическое обновление предопределенных данных, предопределенные данные связаны с реальными данными и предопределенные данные изменены в конфигураторе. Во всех остальных случаях информация, введенная в конфигураторе, не будет перенесена в информационную базу.
Изменение порядка следования предопределенных элементов в предопределенных табличных частях плана счетов и плана видов расчета обрабатывается в связанных данных, т. е. порядок элементов в данных будет таким же, каким он задан в метаданных. Данные, введенные пользователем (не предопределенные) будут располагаться после предопределенных.

Если в конфигураторе выполнено удаление элемента предопределенных данных, то будет выполнено следующее:
● Элемент данных, связанный с элементом предопределенных данных, будет помечен на удаление.
● В списке субконто элемента плана счетов будут удалены соответствующие записи.
● В списках ведущих, базовых и вытесняющих видов расчета будут удалены соответствующие записи.
Для принудительного создания элементов предопределенных данных (для справочников, планов видов характеристик, планов видов расчетов и планов счетов) следует воспользоваться методом ИнициализироватьПредопределенныеДанные(). Вызов этого метода выполнит принудительное создание элементов предопределенных данных при выполнении следующих условий:
● Предопределенные элементы ранее не создавались в текущей области данных.
● Обновление предопределенных данных настроено таким образом, что создание и обновление предопределенных данных должно выполняться.
Если указанные условия не выполняются – создание предопределенных элементов не выполняется.
Если в прикладном решении отключено автоматическое обновление предопределенных данных, то удаление предопределенного элемента приводит к изменению в связанном объекте данных (если таковой есть). Значение свойства ИмяПредопределенныхДанных заменяется значением #xxxxxxxx-xxxxxxxx-
xxxx-xxxxxxxxxxxx, где xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx – это уникальный идентификатор удаленного элемента метаданных.
Если требуется получить список предопределенных элементов для объекта конфигурации, то сделать это можно с помощью метода
ПолучитьИменаПредопределенных().
Пример получения списка предопределенных:

Список = Метаданные.Справочники.Товары.ПолучитьИменаПредопределенных();

Если метод вернул пустой массив, значит, у объекта конфигурации отсутствуют предопределенные значения. В противном случае можно, например, для
каждого предопределенного элемента выполнить проверку наличия связанного элемента в данных.

Работа в распределенной информационной базе

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

Например, выполняется универсальный обмен данными между одинаковыми информационными базами. В каждой информационной базе существует
справочник Номенклатура. В каждой информационной базе в этом справочнике содержится предопределенный элемент Услуга. Ссылки на эти объекты данных разные.
Тогда при загрузке произойдет следующее: система обнаружит наличие в базе-приемнике предопределенный элемент Услуга и выполнит загрузку с сохранением свойства ИмяПредопределенногоЭлемента. Это будет возможно в том случае, если перед записью элемента свойство ОбменДанными.Загрузка установлено в значение Истина. В противном случае будет вызвано исключение.
Однако при попытке обратиться в базе-приемнике к предопределенному элементу Услуга, произойдет ошибка, т. к. в системе не может быть двух объектов, связанных с одинаковым предопределенным элементом.
Не следует допускать возникновения такой ситуации. Прикладной разработчик должен самостоятельно обрабатывать попытку загрузки объекта данных с дублирующим именем предопределенных данных.
● При записи объекта данных, у которого имя предопределенных данных ссылается на удаленный элемент (имеет вид #xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), то такой элемент будет записан в любом случае. Однако система не позволит записать два объекта,
ссылающиеся на один удаленный предопределенный элемент (с одинаковым значением имени предопределенных данных), кроме как в случае, когда перед записью элемента свойство ОбменДанными.Загрузка установлено в значение Истина.

О чем эта статья

Эта статья продолжает цикл статей «Первые шаги в разработке на 1С». В ней на практических примерах рассматривается механизм предопределенных данных, в т.ч. и в распределенной информационной базе.

Применимость

В статье рассматривается платформа 1С:Предприятие версии 8.3.4.465. Материал актуален и для текущих релизов платформы.

Предопределенные элементы в «1С:Предприятие 8.3»

При реализации алгоритмов разработчики часто опираются на определенные данные – элементы справочников, планов счетов, планов видов расчета и т.д.

Во встроенном языке существуют методы для поиска данных, например, НайтиПоКоду() или НайтиПоНаименованию().

Однако алгоритмы, опирающиеся на код или наименование, зачастую являются ненадежными.

Поскольку в пользовательском режиме код или наименование элемента справочника могут быть изменены, что может привести к неработоспособности алгоритмов.

Именно для решения этой проблемы и предназначены предопределенные данные – данные, созданные в конфигураторе, обратиться к которым возможно по имени, не прибегая к предварительному поиску элемента.

Таким образом, у предопределенных данных есть две «стороны”: во-первых, существует список предопределенных элементов, созданный в конфигураторе, а, во-вторых, для данных информационной базы указывается, является ли конкретный элемент предопределенным.

Предопределенные элементы могут быть созданы у:

  • справочников;
  • планов счетов;
  • планов видов характеристик;
  • планов видов расчета.

В статье рассмотрены новшества, касающиеся предопределенных данных на платформе 8.3, а также особенности работы с ними в распределенных базах (как центральных, так и периферийных) и в информационных базах в режиме разделения данных.

Для примера, создадим в справочнике Организации предопределенный элемент ОсновнаяОрганизация:

Для увеличения нажмите на изображение.

Обращение к этому элементу из программного кода будет следующим:

В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа.

Для этого у объектов, которые могут иметь предопределенные элементы (они указаны выше), добавлено новое свойство ИмяПредопределенныхДанных. Оно отображается в списке стандартных реквизитов:

Выберем при помощи запроса все поля из справочника Организации:

Для увеличения нажмите на изображение.

На рисунке видно, что в поле ИмяПредопределенныхДанных указан именно тот идентификатор, который мы ввели в режиме конфигуратора.

Предопределенный элемент в списке отображается специальной пиктограммой:

Чтобы «отсоединить” элемент данных от элемента предопределенных данных, нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент:

&НаКлиенте
Процедура Отсоединить(Команда)
ОтсоединитьНаСервере();
КонецПроцедуры&НаСервереБезКонтекста
Процедура ОтсоединитьНаСервере()
ОбъектДанных = Справочники.Организации.ОсновнаяОрганизация.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = «”;
ОбъектДанных.Записать();
КонецПроцедуры

Пиктограмма в списке изменилась:

Теперь предопределенный элемент существует только в конфигурации и в данных нет элемента, привязанного к идентификатору ОсновнаяОрганизация:

Для увеличения нажмите на изображение.

Обращение из программного кода к предопределенному элементу вызовет исключение:

Чтобы связать предопределенный элемент с новой записью, нужно присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента:

&НаКлиенте
Процедура Привязать(Команда)
ПривязатьНаСервере();
КонецПроцедуры&НаСервереБезКонтекста
Процедура ПривязатьНаСервере()
НайденнаяСсылка = Справочники.Организации.НайтиПоНаименованию(«ООО «”Товары”””);
ОбъектДанных = НайденнаяСсылка.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = «ОсновнаяОрганизация”;
ОбъектДанных.Записать();
КонецПроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх