Предопределенные элементы в «1С:Предприятие 8.3»
(бесплатная статья по Программированию в 1С)
из цикла статей «Первые шаги в разработке на 1С»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код обращения

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

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

ИмяПредопрделенныхДанных

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

Выбор полей

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

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

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

Предопределенный элемент

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

&НаКлиенте
Процедура Отсоединить(Команда)
ОтсоединитьНаСервере();
КонецПроцедуры

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

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

Отсоединенный элемент

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

Идентификатор ОсновнаяОрганизация

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

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

Предопределенный элемент отсутствует в данных

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

&НаКлиенте
Процедура Привязать(Команда)
ПривязатьНаСервере();
КонецПроцедуры

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

Теперь с пиктограммой предопределенного элемента выводится другой элемент справочника:

Пиктограмма предопределенного элемента

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

В случае его обнаружения будет выдано сообщение об ошибке:

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

При помощи запроса обратимся к полю ИмяПредопределенныхДанных.

Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“ИмяПредопределенныхДанных”, ИмяПредопределенныхДанных);

Запрос.Текст =
“ВЫБРАТЬ
| Организации.Ссылка,
| Организации.Наименование,
| Организации.Код
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных”
;

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЕсли;

Если параметр запроса ИмяПредопределенныхДанных принимает значение “ОсновнаяОрганизация”, запрос выполняется без ошибок.

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

Предопределенный элемент не принадлежит Организации

При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначенияКлиентСервер, которая возвращает Неопределено для несуществующих в информационной базе предопределенных элементов:

Организация= ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(“Справочник.Организации.
ОсновнаяОрганизация”
);

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


ОбъектДанных= Метаданные.Справочники.Организации;
ТекстЗапроса =
|ВЫБРАТЬ
| ИмяОбъекта.Ссылка
|ИЗ
| “
+ ОбъектДанных.ПолноеИмя() + ” КАК ИмяОбъекта
|
|ГДЕ
| ИмяОбъекта.Предопределенный
;

Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
ИмяПредопределенного = Справочники[ОбъектДанных.Имя].ПолучитьИмяПредопределенного
(
Выборка.Ссылка);
Сообщить(ИмяПредопределенного);
КонецЦикла;

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

Однако начиная с платформы 8.3.3, метод ПолучитьИмяПредопределенного() является устаревшим и поддерживается для совместимости, поэтому даже в Синтакс-помощнике платформы 8.3.4 он не отображается.

Синтакс-помощник платформы

В платформе 8.3 существует метод глобального контекста ПолучитьПолноеИмяПредопределенногоЗначения(). Этот метод выполняет действие, обратное методу ПредопределенноеЗначение(), – по ссылке на предопределенный элемент возвращает полное имя предопределенного значения.

Метод глобального контекста

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

Теперь в платформе присутствуют новые права доступа, определяющие возможность редактирования предопределенных данных:

  • ИнтерактивноеУдалениеПредопределенныхДанных,
  • ИнтерактивнаяПометкаУдаленияПредопределенныхДанных,
  • ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных,
  • ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных.

Права доступа для редактирования предопределенных данных

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

Ограничения доступа к данным

Однако “интерактивные” права на просмотр и редактирование стандартных реквизитов Предопределенный и ИмяПредопределенныхДанных можно установить по отдельности:

Права на просмотр и редактирование

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

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

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

  • Авто – необходимость создания предопределенных элементов и обновление существующих будет определяться системой автоматически;
  • НеОбновлятьАвтоматически – не будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений. В случае отсутствия элемента данных, связанного с предопределенным элементом, будет сгенерировано исключение при попытке обращения к нему;
  • ОбновлятьАвтоматически – будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений.

Чтобы принять решение, нужно ли создавать и обновлять предопределенные данные, система последовательно анализирует следующие значения:

  • значение, установленное для объекта в данных;
  • значение, установленное для объекта метаданных в конфигураторе;
  • значение, установленное в целом для информационной базы;
  • вид информационной базы – центральная (либо не распределенная база) или периферийная база.

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

Подробнее будет рассмотрено ниже.

Такое большое количество анализируемых значений было реализовано для возможности полноценно управлять созданием и обновлением предопределенных данных.

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

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

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

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

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

Эти методы доступны у объектов типа СправочникМенеджер, ПланСчетовМенеджер, ПланВидовХарактеристикМенеджер, ПланВидовРасчетаМенеджер.

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

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

Обновление предопределенных данных

3. Иначе если для информационной базы установлен режим обновления, отличный от Авто, то используется это значение.

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

4. Иначе анализируется вид узла распределенной базы. Если это периферийный узел, то предопределенные данные не будут обновлены (соответствует значению НеОбновлятьАвтоматически).

Если проверка выполняется для центрального узла распределенной базы или для базы, не являющейся распределенной, обновление предопределенных данных будет выполнено (соответствует значению ОбновлятьАвтоматически).

Если база находится в режиме совместимости “Версия 8.3.3”, то алгоритм определения необходимости обновления предопределенных данных выглядит немного по-другому.

Обновление не будет производиться:

  • если в метаданных или в данных установлено НеОбновлятьАвтоматически;
  • если в метаданных или в данных установлено Авто и текущий узел является периферийным.

В противном случае предопределенные данные будут обновлены.

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

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

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

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

Обновление данных, связанных с предопределенными, будет выполняться, если:

  • разрешено автоматическое обновление предопределенных данных;
  • предопределенные данные связаны с данными информационной базы;
  • предопределенные данные изменены в конфигураторе.

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

Если в конфигураторе удалить предопределенный элемент, то будут выполнены следующие действия:

  • элемент данных, связанный с предопределенным элементом, будет помечен на удаление;
  • в списке субконто элемента плана счетов будут удалены соответствующие записи;
  • в списках ведущих, базовых и вытесняющих видов расчета будут удалены соответствующие записи.

Установим для справочника Организации в конфигураторе свойство ОбновлениеПредопределенныхДанных в НеОбновлятьАвтоматически и удалим предопределенный элемент ОсновнаяОрганизация.

В пользовательском режиме у элемента справочника, связанного с предопределенным, значение свойства ИмяПредопределенныхДанных стало равным #708c7031-c7bd-45d4-a8c9-65b2fecfde62, где символы после знака “#” – это уникальный идентификатор удаленного элемента метаданных.

Идентификатор удаленного элемента метаданных в пользовательском режиме

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

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

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

Автоматического создания предопределенных данных в периферийной базе не происходит.

В распределенной базе иногда могут возникать ошибки, которые исправляются после отключения от РИБа, загрузки в периферийную базу конфигурации центральной базы и дальнейшего подключения к распределенной базе.

При работе на платформе 8.3 следует учитывать следующую особенность.

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

Чтобы не допустить такого поведения, можно использовать метод глобального контекста УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы() или использовать параметр командной строки в пакетном режиме запуска конфигуратора /SetPredefinedDataUpdate, который предназначен для указания режимов обновления предопределенных данных.

Этот параметр может принимать одно из трех значений:

    • UpdateAutomatically – при реструктуризации информационной базы будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений;
    • DoNotUpdateAutomatically – при реструктуризации информационной базы не будет выполняться автоматическое создание новых предопределенных элементов и обновление их значений;
    • Auto – фактическое значение вычисляется автоматически. Для главного узла информационной базы значение будет равно UpdateAutomatically, для периферийного узла информационной базы будет равно DoNotUpdateAutomatically.

Командная строка запуска конфигуратора с этим параметром будет выглядеть следующим образом:

“C:\Program Files\1cv8\8.3.4.437\bin\1cv8.exe DESIGNER /F”ПутьКБазе” /N”Администратор” /P”Пароль” /SetPredefinedDataUpdate -DoNotUpdateAutomatically”

Таким образом возможно задавать признак обновления предопределенных данных, когда информационная база отключается от РИБ, например, для восстановления работоспособности.

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

Для информационной базы, где создаются предопределенные элементы, следует использовать значение UpdateAutomatically, а для второй информационной базы – DoNotUpdateAutomatically.

В платформе 8.3 для объектов конфигурации, которые могут содержать предопределенные данные (справочники, планы счетов, планы видов характеристик, планы видов расчета), реализована возможность устанавливать свойство ИмяПредопределенныхДанных в значение специального вида, состоящее из символа “#” и текстового представления уникального идентификатора.

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

В платформе 8.2.14 появился механизм разделения данных. При использовании разделенной базы предопределенные элементы создавали ряд ограничений.

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

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

Ссылки на предопределенные элементы более не являются одинаковыми, в том числе и в различных областях (даже для объектов, входящих в состав разделителя в режиме Независимо).

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

Пусть в базе есть две области: с кодами 01 и 02.

Значит, уникальный идентификатор элемента данных, связанного с элементом ОсновнаяОрганизация в области с кодом 01, не будет равен уникальному идентификатору элемента данных, связанного с элементом ОсновнаяОрганизация в области 02.

Подведем итоги. Рассмотрим, для чего было внесено столько нововведений в работу с предопределенными данными.

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

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

Один предопределенный элемент имел одинаковую ссылку во всех областях данных.

При обмене данными с использованием РИБа предопределенные данные передавались только с изменениями конфигурации прикладного решения. Управлять созданием и обновлением предопределенных данных было невозможно.

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

На этом мы завершаем наше первое знакомство с предопределенными элементами.

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

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

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.


Статья по программированию - в PDF-формате

Статья в PDF-формате

Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

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

Комментарии / обсуждение (74):

  1. AlexPC

    Есть где-нибудь подробное описание внутренних механизмов работы платформы с предопределенными элементами. Запоминается ли где-нибудь внутри ИБ “статус” предопределенного элемента и т.п.?

    Поясню на примере: РИБ, подчиненный узел, справочник, обновление предопределенных данных = авто. Сбрасываем главный узел, загружаем конфигурацию, обновляем – новый предопределенный элемент должен создаться? Далее, допустим не создался. Удаляем в конфигурации предопределенный элемент, затем опять загружаем конфигурацию, обновляем – новый предопределенный элемент должен создаться?

    • Василий Ханевич

      Добрый день!
      Для предопределенных элементов есть внутренний идентификатор. Он используется, например, при сравнении-объединении конфигураций. Т.е. если удалить в конфигураторе предопределенный элемент и создать его еще раз заново с тем же кодом и с тем же наименованием, то для системы это будет другой элемент.

      Должно вот в такой последовательности должно корректно работать переподключения базы к РИБ:
      1. База отключается от РИБ. Программным кодом отключается автоматическое обновление предопределенных данных.
      2. Загружается конфигурация из центральной базы. Пока не обновляем конфигурацию БД.
      3. Запускаем в пользовательском режиме, не обновляем конфигурацию БД. Обработкой подключаем к РИБ – устанавливаем главный узел.
      4. Обновляем конфигурацию БД. Запускаем в пользовательском режиме, должны сработать обработчики обновления.

  2. Анна

    Здравствуйте,
    в статье “…Таким образом можно создавать обработки загрузки предопределенных данных из файла”.
    Вопрос: уточните, пожалуйста, какой должен быть код обработки, для создания в базе предопределённых счетов (чтобы они создались в конфигураторе соответственно)?

    База не РИБ, у плана счетов выбрано “Обновлять автоматически”
    Спасибо

    • Василий Ханевич

      Добрый день!
      Из пользовательского режима обработкой создать предопределенный элемент в конфигураторе не получится, т.к. это по сути не только данные, но и метаданные.
      Обработкой в пользовательском режиме можно назначить предопределенным тот или иной элемент справочника. Или можно заменить предопределенный элемент – в пользовательском режиме элемент №1 был предопределенным, его сделать “обычным”, а предопределенным назначить элемент №2.
      Для этого программно работаем со свойством ИмяПредопределенныхДанных:

      ОбъектДанных.ИмяПредопределенныхДанных = "...";
  3. Яков Коган

    Утверждение “Получение списка предопределенных элементов, заданных в метаданных, при помощи встроенного языка – невозможно.” уже устарело. Есть ПолучитьИменаПредопределенных(), которая решает эту задачу. Также можно вывалить предопределённые в макет и его обработать, либо выгрузить конфу и прочитать хмл-файл, но эта функция лучше всего.

  4. gosn1ck

    добрый день.
    у меня не очень классическая ситуация и связан он с обменом. имеется 2 конфигурации 8.3 (платформа 8.3.10 без режима совместимости) и 8.2. в них обменивается справочник, который содержит предопределенные элементы и собственно вопрос как настроить обмен между ними корректно на ваш взгляд?

    • Василий Ханевич

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

  5. Denis_Denis

    Добрый день, коллеги!
    Столкнулись со следующей проблемой:
    При обновлении на новую конфигурацию бухгалтерии 3.0, в новом обновлении фирма 1С добавила, предопределенный счет 19.10, но у нас в конфигурации уже данный счет есть, при обновлении появились ошибки, что счет 19.10 уже существует в конфигурации (добавлен в режиме 1С) и код планов счетов стал не уникальным.
    Как быть в этой ситуации?
    Возможные варианты вижу следующие:
    1. Переименовать наш счет из 19.10 в 19.11 до обновления. Но тогда во всех документов, которые использовались до этого и проводках счет поменяет представление с 19.10 на 19.11;
    2. У предопределенного счета поменять код на 19.11 и подправить типовой код по заполнению бухгалтерской отчетности где используется условие на код счета (типовой функционал). Но в этом случае при последующих обновлениях всегда придется отслеживать данные изменения связанные с с условиями на код счета.

    Что вы можете посоветовать в этой ситуации?
    В заранее спасибо.

    • Василий Ханевич

      Добрый день!
      Главное – выполнять обновление через поддержку, а не через сравнение-объединение. Дело в том, что для платформы предопределенные элементы идентифицируются не кодом или названием, а внутренним уникальным идентификатором. И при сравнении-объединении идентификаторы могут меняться.
      После обновления в пользовательском режиме можно поменять коды счетов. Самый простой вариант – вариант №1, попробуйте поговорить с бухгалтерией.

  6. zww

    1с Бухгалтерия 3.0 Я в конфигураторе добавил субконто к счету 50.02. Затем решил использовать другое субконто. В предприятии получилось 2 субконто новое и старое. Удаляю в конфигураторе все субконто счета 50.02 В предприятии так 2 и остались. База у меня не распределенная. Соответственно, при изменении субконто предопреденного счета в конфигураторе, он должен меняться автоматически в предприятии. Что я делаю не так?

    • Василий Ханевич

      Добрый день!
      Нет, в пользовательском режиме можно изменять состав субконто на счете. Поэтому нужно в режиме “1С:Предприятие” установить требуемый состав субконто для счета.

        • Василий Ханевич

          Значит, нужно будет обработкой поправить, но в пользовательском режиме. Либо в конфигурации разрешить ручное изменение списка субконто на этих счетах.

          • zww

            Все разобрался. Одна из побочных ситуаций предопределенных объектов. Надо исключить 50 счет из запрещенных к редактированию в предприятии. В модуле счета исключил 50 счет и отредактировал субконто. Вот здесь.
            УчетДвиженияДенежныхСредств = Новый Массив(6);
            УчетДвиженияДенежныхСредств[0] = ПланыСчетов.Хозрасчетный.Касса; // 50
            УчетДвиженияДенежныхСредств[1] = ПланыСчетов.Хозрасчетный.РасчетныеСчета; // 51
            УчетДвиженияДенежныхСредств[2] = ПланыСчетов.Хозрасчетный.ВалютныеСчета; // 52
            УчетДвиженияДенежныхСредств[3] = ПланыСчетов.Хозрасчетный.СпециальныеСчета; // 55
            УчетДвиженияДенежныхСредств[4] = ПланыСчетов.Хозрасчетный.ПереводыВПути; // 57.01
            УчетДвиженияДенежныхСредств[5] = ПланыСчетов.Хозрасчетный.ПереводыВПутиВал; // 57.21
            УчетДвиженияДенежныхСредств = БухгалтерскийУчет.СформироватьМассивСубсчетов(УчетДвиженияДенежныхСредств);
            УчетДвиженияДенежныхСредств = ОбщегоНазначенияКлиентСервер.СократитьМассив(УчетДвиженияДенежныхСредств, СчетаИсключения);

  7. Елизавета

    Здравствуйте! спасибо за статью, статья замечательная. Но столкнулась с проблемой(( делаю внешнюю обработку, что бы “отсоединить” элемент данных от элемента предопределенных данных, а потом связать предопределенный элемент с новой записью. Скопировала ваш код, но у меня выходит ошибка: Поле объекта не обнаружено (ИмяПредопределенныхДанных)ОбъектДанных.ИмяПредопределенныхДанных = “”; В чем может быть проблема?((

    • Василий Ханевич

      Добрый день!
      Либо старая версия платформы, которая еще не поддерживает эти возможности, либо режим совместимости конфигурации, с которым не работает этот функционал.

  8. Сергей

    Здравствуйте! Хочу сделать предопределённый объект в справочнике “Пратнёры” в 1C:ERP 2.2 непредопределённым, чтобы затем удалить его (мне “Розничный покупатель” совсем не нужен). Скажите пожалуйста, куда вписывать код, который Вы привели выше (после слов: “… нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент: …”)?
    И нужно ли писать оба абзаца (для Клиента и для Сервера), если ERP у меня стоит на съёмном диске полностью (толстый клиент) без всяких внешних серверов?
    Потому что если поставить все четыре “галки” в Конфигураторе, как показано выше на рисунке с “Правами” (Интерактивные удаления и пометки), то в пользовательском режиме всё равно не удалить этот элемент.

    • Василий Ханевич

      Добрый день!
      Нужно создать внешнюю обработку, открыть форму обработки. На форме создать команду, вынести ее на форму. Мы получим кнопку. Нужно реализовать обработчик – что именно система будет делать при нажатии на кнопку.
      Приведенный программный код как раз и будет выполняться при нажатии на кнопку (выполнении команды). Сначала работаем на клиенте, но поскольку требуется работа с данными, переходим в серверную процедуру, где и происходит работа с элементом справочника.
      Даже если мы работаем в файловом варианте без сервера “1С:Предприятие”, нужно разделять код на клиентские и серверные методы. Это особенность работы с управляемыми формами.

      • Сергей

        Василий, большое спасибо! Самому сделать это мне кажется сложноватым, внешних обработок я ещё не создавал … Но я увидел в Конфигураторе, что если в справочнике “Партнёры” щёлкнуть ПКМ по “Открыть предопределённые данные” – открывается окно со всеми тремя предопределёнными партнёрами. При этом активна опция “удалить” в меню выше. Нельзя ли так избавиться от них? Это будет намного проще. Пробовать самостоятельно не хочу – хотелось бы прежде услышать Ваше мнение.

        • Василий Ханевич

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

          • Сергей

            Василий! Ещё маленький вопрос по предопределённым элементам. Как изменить вид отношений в карточке Партнёра на вкладке “Общая информация”(клетки “Клиент”, “Поставщик” и “Прочие отношения” не активны)? Почему-то у обычного Партнёра “галочки” в этих клетках ставить и удалять можно, а в случае предопределённого – нет!

            • Василий Ханевич

              Добрый день!
              Это реализовано на уровне программного кода конфигурации. Например, в УТ 11 это действие выполняется в процедуре ПартнерФормаЭлементаУправлениеДоступностью общего модуля ПартнерыИКонтрагенты. Для предопределенного элемента эти галочки доступны только на чтение.
              Так что если вам нужно изменить их, то можно программно при помощи обработки установить галочки так, как вам требуется.

              • Сергей

                Василий, большое спасибо за ответ! Я пользуюсь не УТ 11, а 1С:ERP УП 2 (2.2.1.142). Обработок сам не писал (для 1С), но программных вмешательств не боюсь, потому что когда-то (ещё в прошлом веке) писал на Турбо С 3.0 ++. С одной стороны, понимаю, что “сыроват” – язык 1С не изучал ещё. С другой стороны – “не боги горшки обжигают”: Фортран, Бэйсик, Pascal, PL, Кобол, Алгол, Турбо и Borland C, и даже машинно-ориентированный Ассемблер, – когда-то “пройдены на “Ура” в ВУЗе” …. Вижу, что улыбаетесь, но вряд ли десятую планету Солнечной системы открыли разработчики 1С – заглядывал я в модули: всё довольно интуитивно, в чём-то где-то похоже на какие-то языки из перечисленных выше и доступно для освоения, да ещё – и на русском языке!
                Но, может быть можно “залезть” в нужный код и без создания обработок что-то там изменить. Если возможно, не подскажете имя Процедуры и где там “поковыряться”?

                • Василий Ханевич

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

                      Если Форма.Объект.Предопределенный Тогда
                          Форма.Элементы.Клиент.ТолькоПросмотр = Истина;
                          Форма.Элементы.Поставщик.ТолькоПросмотр = Истина;
                          Форма.Элементы.Конкурент.ТолькоПросмотр = Истина;
                          Форма.Элементы.ПрочиеОтношения.ТолькоПросмотр = Истина;
                          Форма.Элементы.ОбслуживаетсяТорговымиПредставителями.ТолькоПросмотр = Истина;
                          Форма.Элементы.Перевозчик.ТолькоПросмотр = Истина;
                      КонецЕсли;
  9. ark

    скорей всего я что то не совсем понял. При обмене РИБ в ЦБ добавлен предопределенный реквизит и при старте системы к нему идет обращение. В УБ естественно происходит ошибка, т.к. конфу обновили. а вот данные нет. Как лучше всего обработать эту ситуацию?

    • Василий Ханевич

      Добрый день!
      Теперь предопределенные данные переносятся как обычные данные (элементы справочников, документы и т.д.). В конфигурации нужно предусмотреть возможность выполнить обмен без обращения по имени к предопределенным элементам, которые приходят из центрального узла.
      На сайте ИТС есть рекомендации – Пересмотр работы с предопределенными элементами в РИБ:
      В “1С:Предприятии 8.3” в дочерних узлах РИБ предопределенные элементы автоматически не создаются (и не обновляются при изменении в метаданных), а должны быть переданы из главного узла вместе с изменениями конфигурации.
      Для устранения несовместимости необходимо:
      a) обеспечить загрузку сообщения обмена в подчиненный узел РИБ до выполнения другого прикладного кода, который обращается к получаемым из главного узла предопределенным элементам;
      b) в прикладной логике загрузки данных из главного узла (обработчик события ПриПолученииДанныхОтГлавного, правила регистрации объектов) избегать обращений к предопределенным элементам, поскольку нет гарантии, что они уже были загружены из сообщения обмена;
      c) код обработчиков обновления ИБ, который обрабатывает предопределенные элементы, не должен выполняться в подчиненных узлах РИБ.

  10. Дмитрий

    при переходе с БП на БСО в конфигураторе появились несколько специфических предопределенных “строительных” счетов.
    в базе данных есть соответствующие им элементы, но связать их никак не получается. При обращении обработками из режима предприятие счета не видны (ни обработкам, ни пользователю).
    То есть, чтобы связать предопределенные элементы с данными их надо увидеть из пользовательского режима, а для этого они должны быть уже связаны… Как выйти из этого порочного круга?

    • Василий Ханевич

      Добрый день!
      Вы пишете
      в базе данных есть соответствующие им элементы
      Т.е. в пользовательском режиме есть все-таки элементы и их нужно сделать предопределенными? Тогда вот этим элементам обработкой нужно заполнить свойство ИмяПредопределенныхДанных.

      • Дмитрий

        В пользовательском режиме есть сами предопределенные данные. И именно их “имя” нужно связать с предопределенным объектом конфигурации (счетом).
        Эти данные я вообще нашел только вот этой обработкой http://infostart.ru/public/305892/, которая как раз и предназначена для связи предопределенных объектов с предопределенными данными. Но найдя несвязанные предопределенные данные она дает выбрать все объекты конфигурации, кроме нужных (потому что их не видно). Возможно, у плана счетов есть свои особенности…

        • Василий Ханевич

          По описанию обработка как раз делает то, что нужно. Может быть, какие-нибудь ограничения есть интерфейсные.
          Смотрите, в конфигураторе мы добавили новый предопределенный элемент НовыйСчет. Какие варианты могут быть в пользовательском режиме?
          1. В данных есть только один элемент, у которого ИмяПредопределенныхДанных равно НовыйСчет. Это правильная ситуация. Тут ничего править не нужно.
          2. В данных нет элементов, у которого ИмяПредопределенныхДанных равно НовыйСчет. Тогда нужно обработкой “привязать” существующий или только что созданный специально для этого счет к предопределенным данным.
          3. В данных есть несколько элементов, у которого ИмяПредопределенныхДанных равно НовыйСчет. Тогда нужно обработкой “отвязать” все счета, привязанные к предопределенным данным, кроме одного.

  11. Алексей

    А можно ли как-то получить наименование предопределенного элемента? Хочу программно создать предопределенный элемент, а как получить его наименование не знаю.

    • Василий Ханевич

      Добрый день!
      Создать предопределенный элемент можно только в конфигураторе. А программно можно связать предопределенный элемент с каким-либо элементом в данных. Для этого используется свойство ИмяПредопределенныхДанных. Это свойство доступно для чтения (так можно получить имя предопределенного элемента) и для записи (так можно установить связь с предопределенным элементом).

  12. Алексей

    Спасибо, хорошая статья.
    По поводу: “Получение списка предопределенных элементов, заданных в метаданных, при помощи встроенного языка – невозможно.” – устаревшие данные.

    С 8.3.5 появилась функция “ПолучитьИменаПредопределенных”.

    • Василий Ханевич

      Добрый день!
      Спасибо за уточнение.
      Действительно, начиная с платформы 8.3.5 для справочников, планов видов характеристик, планов счетов, планов видов расчетов доступен метод ПолучитьИменаПредопределенных(). Теперь можно получить список имен предопределенных элементов, заданных в конфигураторе. По этому списку можно проверить, что для всех предопределенных элементов есть элементы в данных.

  13. dj_serega

    Верно ли утверждение:
    С предприятия создать предопределенный элемент не получится?

    Что хочу:
    1. Создать элемент в предприятии.
    2. Заполнить реквизит “ИмяПредопределенногоЭлемента”.
    3. А при записи создался предопределенный элемент.

    Что есть:
    1. Создать предопределенный элемент в конфигураторе.
    2. Найти СТАРЫЙ элемент в предприятии.
    3. Заполнить в нём реквизит “ИмяПредопределенногоЭлемента”.
    4. Удалить автоматически созданный элемент с п.1.

    upd: Я понял :)
    Нужно установить “обновление предопределенных данны” в “Не обновлять автоматически” и тогда элемент не будет создаваться.
    Спасибо :)

    • Василий Ханевич

      Подскажите, пожалуйста, а какую практическую задачу вы решаете? В связи с чем возник вопрос – обмен данными в распределенной базе?

  14. dj_serega

    Получилось так что в конфигураторе нет возможности добавить предопределенный элемент (кнопка добавить не активна).
    При попытке добавить предопределенный элемент с предприятия ошибка:
    Предопределенный элемент не принадлежит “ИмяСправочника”.

    Найдена cf где эти элементы есть в справочнике. Объединили конфу. При открытии критическая ошибка. Варианты: Закрыть или Завершить работу :(

    upd. Текст ошибки:
    Невосстановимая ошибка
    Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
    по причине:
    Ошибка SDBL:
    Тип поля OwnerID несовместим с типом литерала NUMERIC

    upd2. Причина найдена.
    Все оказалось просто. У справочника в 1С добавили владельца. А у справочников с владельцем предопределенных элементов не может быть :)

  15. foralex2004

    Столкнулся с этой проблемой при обновлении. Статья очень помогла. Спасибо.

    • Василий Ханевич

      Пожалуйста. Отлично, что статья помогла вам на практике!
      Можете немного подробнее расписать – какую конфигурацию обновляли, типовая или измененная, с какими предопределенными данными возникла проблема?

  16. ivanovav1983

    Ох, спасибо огромное за статью, выручаете меня в какой раз. Теперь стало понятно почему “задвоились” предопределенные счета в плане счетов и предопределенные элементы в справочниках в БП 3.0 на платформе 8.3. После переноса данных через универсальную обработку обмена УниверсальныйОбменДаннымиXML.epf для идентичных конфигураций с ИТС. Когда в первый раз увидел такую проблему, аж волосы на голове зашевелились.

    • Grigoriy

      Столкнулся с задвоением плана счетов после выгрузки-загрузки XML. Подскажите подробно что делали для исправления этого? Заранее спасибо

  17. Константин

    Добрый день!
    Спасибо большое за подробную статью!
    Читая, старался соотнести получаемую информацию со “своим текущим моментом”. А в “мой текущий момент” ситуация такова, что я целиком и полностью занят на работе с “Комплексной автоматизацией” – 1.1, что привязывает меня к работе в режиме обычного приложения.
    ВОПРОС: Отличается ли как-то использование предопределенных элементов, описанных в данной статье, от работы в режиме обычного приложения, под управлением платформы 8.3.4, но в режиме “Совместимости с 8.2.13”?
    P.S. Насколько понимаю, в данном случае статья для меня имеет чисто академический интерес.

    • hanv

      При работе на платформе 8.3 в режиме совместимости “Версия 8.2.13” предопределенные элементы работают в “классическом” варианте. Стандартный реквизит ИмяПредопределенныхДанных и описанные в статье особенности становятся доступными при переключении режима совместимости в значение “Версия 8.3.3”.

      • Cos

        Ясно. Спасибо большое за ответ.
        Собственно, это я и подозревал. :)
        Эх, когда же выйдет “комплексная” – 2.0?..

  18. Серхио

    Спасибо за статью – очень познавательно и интересно!
    Только меня мучает один вопрос – для чего это всё? Предопределённые ведь для того и создавались, чтобы иметь какие-то твёрдые ориентиры в этой жизни, а тут получается – я создавал-создавал элементы, писал-писал код, а кто-то зашёл даже не в конфигуратор, а так, всё грохнул и весь труд коту под хвост и полная конфигурация ошибок.

    Я понимаю, что этот вопрос не к авторам статьи, это вопрос в 1С, но, возможно, кто-то более понятливый, чем я, уловил суть этого новшества?

    • hanv

      Классический механизм предопределенных данных создавал ограничения при развитии платформы для “облачных технологий” (режим разделенной информационной базы). Невозможно было использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”. У предопределенного элемента ссылка была одинакова во всех областях данных. Да и при использовании распределенной базы предопределенные элементы переносились только с изменениями конфигурации, что тоже могло доставлять неудобства. Поскольку облачные технологии – достаточно важное направление для 1С, то мы получили такие изменения в платформе 8.3.

      • ivanovav1983

        Мое мнение, что РИБ это уже устаревая технология. “Облачные технологии”, web-клиент и прочее, как раз и были созданы для того, чтобы уйти от РИБ и всяких майкрософт-терминалов, к онлайн работе в одной ИБ в любой точке мира через интернет. Первые типовые конфигурации на УФ (ранние версии УТ 11), даже не содержали “Полного” ПланаОбмена, приходилось снимать с “замка” и вручную создавать его для настройки РИБ. Поэтому мне тоже до конца не понятны эти “танцы с бубном” = с предопределенными элементами. Разве, что создать видимость своей работы, и головной боли для внедренцев. К примеру, задвоение предопределенных счетов в рабочей базе БП 3.0, приводит к очень серьезным и плачевным последствиям…

  19. Escander

    Возможность переопределения пердопределённых значений в пользовательском режиме – это интересная возможность!

    О статье: полезно и очень подробно (и для 8.3.3 и для 8.3.4 в полном объёме), толковая статья!

  20. Сергей Брикульский

    Добрый день. Статья содержит много полезной информации.
    Только в тексте запроса ГДЕ (ИмяОбъекта.Предопределенный = ИСТИНА);,
    лучше писать ГДЕ (ИмяОбъекта.Предопределенный);

  21. Наталья

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

  22. Светлана

    Здравствуйте!!! Рискну прокомментировать..) Не так часто сталкиваюсь с РИБ и читая статью все время пыталась привязать к практике. Получалось плохо. Дочитала до конца и узнав что это важно в РИБ – начала читать сначала. Читать было уже легче. Возможно было бы неплохо конец вынести в начало?? Но, думаю, асам большим чем я, это не нужно. С уважением.

    • Евгений Гилев (Мастер-тренер)

      Добрый день, Светлана!

      Спасибо, учтем Ваше пожелание.

  23. Bliz

    Очень познавательно, Спасибо. В некоторых примерах кода(например после слов “При помощи запроса обратимся к полю ИмяПредопределенныхДанных.”) он обрезается и его не видно, возможно дело в Опере.

    • Евгений Гилев (Мастер-тренер)

      Спасибо, Антон.
      Работаем над этим, в ближайшее время поправим!

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

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