Синтаксическая ошибка общегоназначенияклиентсервер предопределенныйэлемент

(3) Это опять не ответ на твой вопрос «КАК?»

включено использование общих функций в выражения?

Если компоновка данных выполняется при помощи стандартных средств объекта Отчет, то использование внешних функций разрешено. Если же компоновка данных осуществляется при помощи объектов системы компоновки данных, то, для того, чтобы разрешить использование внешних функций, необходимо в качестве значения параметра ВозможностьИспользованияВнешнихФункций функции Инициализировать объекта ПроцессорКомпоновкиДанных передать значение Истина. В противном случае использовать внешние функции не получится.

Пример инициализации процессора компоновки данных:

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);

https://its.1c.ru/db/metod8dev#content:3332:hdoc

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

Эта статья продолжает цикл статей «Первые шаги в разработке на 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 Files1cv88.3.4.437bin1cv8.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.

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

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

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

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

32 Comments

  1. Спасибо за сведения. В РИБ была аналогичная ошибка

    «Справочник.УдалитьСтатусыНалогоплательщиковПоНДФЛ.Резидент. Предопределенный элемент отсутствует в данных»

    Изменил предложенный код и всё получилось

    СсылкаНаОбъект=Справочники.УдалитьСтатусыНалогоплательщиковПоНДФЛ;

    ОбновляемыйОбъект = СсылкаНаОбъект.СоздатьЭлемент();// .ПолучитьОбъект();

    ОбновляемыйОбъект.ИмяПредопределенныхДанных = «Резидент»;

    ОбновляемыйОбъект.Наименование= «Резидент»;

    ОбновляемыйОбъект.ОбменДанными.Загрузка = Истина;

    ОбновляемыйОбъект.Записать();

    Reply

  2. Хорошая статья. Помогла.

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

    Вариант — отстутствие главного узла не проходит.

    Не пробовал правда саму базу сделать на время главной.

    Reply

  3. (3) capitan, Зависит от свойства «Обновление предопределеныых данных» конкретного справочника.

    Если «Авто», то в подчиненных базах предопределенные элементы создаваться не будут. Должны прийти с обменом.

    Если «обновлять автоматически», то всегда будут создаваться.

    Reply

  4. (4) Не поняли мой вопрос.

    Откуда база узнает ,что она периферийная ?

    Вариант — отстутствие главного узла не проходит.

    Удалял главный узел, все равно предопределенные элементы не создаются.

    Т.е. база еще где то помнит, что она была периферийной.

    Reply

  5. (5) capitan, Теоретически должны пересоздаться при следующем обновлении конфигурации.

    Т.е. отключить от центрального узла и что-то изменить в конфигурации (банально пробел где-то добавить)

    Либо запустить с ключем /SetPredefinedDataUpdate

    Еще зависит от конфигурации.

    Может быть программно установлен другой режим обновления методом УстановитьОбновлениеПредопределенныхДанных()

    Reply

  6. Спасибо хорошая статейка, и обработка помогла

    Reply

  7. Полезная статья, спасибо!

    Reply

  8. Очень вовремя, спасибо!

    Обработка как раз кстати…

    Reply

  9. По поводу «самого простого способа №1»

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

    Reply

  10. (10) dsp123, Что имеется в виду под «Не видны»?

    Если они есть в базе, то их просто нужно выбрать.

    Если нету, то создать элементы в базе и привязать.

    Reply

  11. Здравствуйте! Ребят подскажите что можно сделать. В плане счетов ЕПСБУ в счете 104.36 появилась галочка «Нет учета по КПС» хотя галочки «Заболансовый» нет, при попытке изменить выдает сообщение что предопределенный элемент не уникален. Я не особый специалист 1С, я только учусь, по этому прошу вашей помощи!

    Reply

  12. (12) Tolyasik, Как раз об этом второй раздел данной статьи

    2. «Предопределенный элемент не уникален» — задвоенные предопределенные элементы:

    Несколько элементов ИБ привязаны к одному предопределенному в конфигурации.

    Эти проблемы отлично решает обработка

    http://infostart.ru/public/305892/

    Reply

  13. Добрый день!

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

    А почему такая ошибка возникает в запросе, в типовом ЗУП 3.0?

    Я добавил в справочник «ПоказателиРасчетаЗарплаты» новый предопределенный элемент, и теперь выскакивает соответствующая ошибка.

    Общий модуль «СтандартныеПодсистемыПовтИсп», функция «ПредопределенныйЭлемент()», текст запроса:

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

    ————————————

    Вопрос снят. Протупил. В запрос передавалось неправильное имя предопределенного.

    Reply

  14. (14) Spacer, столкнулся с аналогичной ситуацией. хоть убей не понимаю, почему это должно вызывать ошибку, а не просто пустой результат запроса, как при поиске по любому другому реквизиту строкового типа. бред какой-то…

    Reply

  15. Добрый день! В бух. 3.0 Что то случилось со справочником ВидыКонтактнойИнформации. Когда открываешь справочник, то он пуст. Скачала Вашу обработку, но она видит все предопределенные элементы справочника и ошибок не находит. При этом в любом справочнике, где используется контактная информация ни адрес ни телефон заполнить нет возможности, просто нет гиперссылок. Может вы встречались с такой ситуацией и можете что то посоветовать? Бьюсь уже 2 дня.

    Reply

  16. Спасибо! очень помогло…ошибка возникла в справочнике «Страны Мира»

    Reply

  17. (2) Спасибо, и у меня получилось, хотя то же пришлось поправить…:

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

    Показать

    Reply

  18. У нас, в ЗУП 2.5, после очередного обновления конфы потребовалось перейти на 8.3. Это было в середине марта. И вот вчера обнаружилось что в документе «Начисление страховых взносов» перестали рассчитываться ФСС НС и ПЗ. Колонка ФСС заполняется, а ФСС НС и ПЗ — нет.

    Два дня искал причину и нашёл — в справочнике ДоходыПоСтраховыхВзносам в предопределенном элементе «ОблагаетсяЦеликом» значение реквизита ВходитВБазуФСС_НС стало Ложь.

    Что характерно у нас несколько баз ЗУП. И в двух из них всё в порядке, а в остальных такое вот.

    Почему? Мне вот не понятно.

    Reply

  19. Благодарю автора за статью.

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

    При чем реквизиты создаваемого элемента «оплата от покупателя» ДОЛЖНЫ быть заполнены в точности, как в демо базе, по крайней мере в нашем случае ВидОперации должен был быть правильно заполнен.

    Reply

  20. Добрый день) Видимо, я что-то недопонимаю, хотя в 1С работаю уже не 1-й год. Нет у меня в справочнике свойства ИмяПредопределенныхДанных через запрос. Вот код:

    Процедура ()

    Об=Справочники.Автоработы.НайтиПоКоду(«ЦБ000000373»).ПолучитьОбъект();

    Об.ИмяПредопределенныхДанных=»ОсмотрАвтомобиля»;

    Об.Записать();

    КонецПроцедуры

    Ругается:

    Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    Откуда вы видите это свойство в справочнике?

    Reply

  21. (21)

    Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    Прямо вот точно так ругается? Или может там другая формулировка.

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

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

    В качестве примера:

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

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

    Показать

    Reply

  22. Полностью Скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    Reply

  23. Полностью скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    Reply

  24. Полностью скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    (22)

    Reply

  25. (25) версия платформы и режим совместимости?

    В самой публикации в самом начале указано: «В 8.3.3».

    Reply

  26. 8.3.10.2580, режим совместимости: 8.2.16

    Reply

  27. (27)

    режим совместимости: 8.2.16

    Вот и ответ. В 8.2 нет этого функционала.

    Reply

  28. (28) Ок, спасибо)))

    Reply

  29. Спасибо за статью!

    Добавлю что в типовых ЗУП 3.1 и БУХ 3 есть функция для получения ссылки предопределенного элемента по его полному имени

    Например:

    ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(«Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы»)

    // Возвращаемое значение:

    // ЛюбаяСсылка — ссылка на предопределенный элемент.

    // Неопределено — если предопределенный есть в метаданных, но не создан в ИБ.

    При ее использовании не будет происходит ошибка «»Предопределенный элемент отсутствует в данных»», как при прямом обращении к предопределенному элементу например «Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы»

    в том случае, например, если в базе не используются «Вечерние часы» и элемент в ИБ не был поэтому целенаправленно создан.

    Reply

  30. вставлю 5 копеек для плана счетов (ругалось при обновлении на 65ый БП3)

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

    Показать

    Reply

  31. Спасибо, статья помогла. В БП3 в конфигураторе у справочника СтатьиЗатрат есть предопределенное значение «КомандировочныеРасходы» в режиме 1С Предприятия, такого элемента не было. Пришлось добавлять элемент, используя ваш код.

    Reply

Leave a Comment

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

#Область СлужебныйПрограммныйИнтерфейс // Возвращает описания всех библиотек конфигурации, включая // описание самой конфигурации. // Функция ОписанияПодсистем() Экспорт МодулиПодсистем = Новый Массив; МодулиПодсистем.Добавить(«ОбновлениеИнформационнойБазыБСП»); ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистем(МодулиПодсистем); ОписаниеКонфигурацииНайдено = Ложь; ОписанияПодсистем = Новый Структура; ОписанияПодсистем.Вставить(«Порядок», Новый Массив); ОписанияПодсистем.Вставить(«ПоИменам», Новый Соответствие); ВсеТребуемыеПодсистемы = Новый Соответствие; Для Каждого ИмяМодуля Из МодулиПодсистем Цикл Описание = НовоеОписаниеПодсистемы(); Модуль = ОбщегоНазначения.ОбщийМодуль(ИмяМодуля); Модуль.ПриДобавленииПодсистемы(Описание); Если ОписанияПодсистем.ПоИменам.Получить(Описание.Имя) <> Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр(«ru = ‘Ошибка при подготовке описаний подсистем: |в описании подсистемы (см. процедуру %1.ПриДобавленииПодсистемы) |указано имя подсистемы «»%2«», которое уже зарегистрировано ранее.’»), ИмяМодуля, Описание.Имя); ВызватьИсключение ТекстОшибки; КонецЕсли; Если Описание.Имя = Метаданные.Имя Тогда ОписаниеКонфигурацииНайдено = Истина; Описание.Вставить(«ЭтоКонфигурация», Истина); Иначе Описание.Вставить(«ЭтоКонфигурация», Ложь); КонецЕсли; Описание.Вставить(«ОсновнойСерверныйМодуль», ИмяМодуля); ОписанияПодсистем.ПоИменам.Вставить(Описание.Имя, Описание); // Настройка порядка подсистем с учетом порядка добавления основных модулей. ОписанияПодсистем.Порядок.Добавить(Описание.Имя); // Сборка всех требуемых подсистем. Для каждого ТребуемаяПодсистема Из Описание.ТребуемыеПодсистемы Цикл Если ВсеТребуемыеПодсистемы.Получить(ТребуемаяПодсистема) = Неопределено Тогда ВсеТребуемыеПодсистемы.Вставить(ТребуемаяПодсистема, Новый Массив); КонецЕсли; ВсеТребуемыеПодсистемы[ТребуемаяПодсистема].Добавить(Описание.Имя); КонецЦикла; КонецЦикла; // Проверка описания основной конфигурации. Если ОписаниеКонфигурацииНайдено Тогда Описание = ОписанияПодсистем.ПоИменам[Метаданные.Имя]; Если Описание.Версия <> Метаданные.Версия Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр(«ru = ‘Ошибка при подготовке описаний подсистем: |версия «»%2«» конфигурации «»%1«» (см. процедуру %3.ПриДобавленииПодсистемы) |не совпадает с версией конфигурации в метаданных «»%4«».’»), Описание.Имя, Описание.Версия, Описание.ОсновнойСерверныйМодуль, Метаданные.Версия); ВызватьИсключение ТекстОшибки; КонецЕсли; Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр(«ru = ‘Ошибка при подготовке описаний подсистем: |в общих модулях, указанных в процедуре ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистемы |не найдено описание подсистемы, совпадающей с именем конфигурации «»%1«».’»), Метаданные.Имя); ВызватьИсключение ТекстОшибки; КонецЕсли; // Проверка наличия всех требуемых подсистем. Для каждого КлючИЗначение Из ВсеТребуемыеПодсистемы Цикл Если ОписанияПодсистем.ПоИменам.Получить(КлючИЗначение.Ключ) = Неопределено Тогда ЗависимыеПодсистемы = «»; Для Каждого ЗависимаяПодсистема Из КлючИЗначение.Значение Цикл ЗависимыеПодсистемы = Символы.ПС + ЗависимаяПодсистема; КонецЦикла; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр(«ru = ‘Ошибка при подготовке описаний подсистем: |не найдена подсистема «»%1«» требуемая для подсистем: %2.’»), КлючИЗначение.Ключ, ЗависимыеПодсистемы); ВызватьИсключение ТекстОшибки; КонецЕсли; КонецЦикла; // Настройка порядка подсистем с учетом зависимостей. Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл Имя = КлючИЗначение.Ключ; Порядок = ОписанияПодсистем.Порядок.Найти(Имя); Для каждого ТребуемаяПодсистема Из КлючИЗначение.Значение.ТребуемыеПодсистемы Цикл ПорядокТребуемойПодсистемы = ОписанияПодсистем.Порядок.Найти(ТребуемаяПодсистема); Если Порядок < ПорядокТребуемойПодсистемы Тогда Взаимозависимость = ОписанияПодсистем.ПоИменам[ТребуемаяПодсистема ].ТребуемыеПодсистемы.Найти(Имя) <> Неопределено; Если Взаимозависимость Тогда НовыйПорядок = ПорядокТребуемойПодсистемы; Иначе НовыйПорядок = ПорядокТребуемойПодсистемы + 1; КонецЕсли; Если Порядок <> НовыйПорядок Тогда ОписанияПодсистем.Порядок.Вставить(НовыйПорядок, Имя); ОписанияПодсистем.Порядок.Удалить(Порядок); Порядок = НовыйПорядок 1; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; // Смещение описания конфигурации в конец массива. Индекс = ОписанияПодсистем.Порядок.Найти(Метаданные.Имя); Если ОписанияПодсистем.Порядок.Количество() > Индекс + 1 Тогда ОписанияПодсистем.Порядок.Удалить(Индекс); ОписанияПодсистем.Порядок.Добавить(Метаданные.Имя); КонецЕсли; Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл КлючИЗначение.Значение.ТребуемыеПодсистемы = Новый ФиксированныйМассив(КлючИЗначение.Значение.ТребуемыеПодсистемы); ОписанияПодсистем.ПоИменам[КлючИЗначение.Ключ] = Новый ФиксированнаяСтруктура(КлючИЗначение.Значение); КонецЦикла; ОписанияПодсистем.Порядок = Новый ФиксированныйМассив(ОписанияПодсистем.Порядок); ОписанияПодсистем.ПоИменам = Новый ФиксированноеСоответствие(ОписанияПодсистем.ПоИменам); Возврат Новый ФиксированнаяСтруктура(ОписанияПодсистем); КонецФункции // Возвращает Истина, если привилегированный режим был установлен // при запуске с помощью параметра UsePrivilegedMode. // // Поддерживается только при запуске клиентских приложений // (внешнее соединение не поддерживается). // Функция ПривилегированныйРежимУстановленПриЗапуске() Экспорт УстановитьПривилегированныйРежим(Истина); Возврат ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить( «ПривилегированныйРежимУстановленПриЗапуске») = Истина; КонецФункции // Возвращает соответствие имен предопределенных значений ссылкам на них. // // Параметры: // ПолноеИмяОбъектаМетаданных — Строка, например, «Справочник.ВидыНоменклатуры», // Поддерживаются только таблицы // с предопределенными элементами: // — Справочники, // — Планы видов характеристик, // — Планы счетов, // — Планы видов расчета. // // Возвращаемое значение: // Соответствие, где // Ключ — Строка — имя предопределенного, // Значение — Ссылка предопределенного. // Функция СсылкиПоИменамПредопределенных(ПолноеИмяОбъектаМетаданных) Экспорт Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ТекущаяТаблица.Ссылка КАК Ссылка, | ТекущаяТаблица.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных |ИЗ | &ТекущаяТаблица КАК ТекущаяТаблица |ГДЕ | ТекущаяТаблица.Предопределенный = ИСТИНА«; Запрос.Текст = СтрЗаменить(Запрос.Текст, «&ТекущаяТаблица», ПолноеИмяОбъектаМетаданных); Выборка = Запрос.Выполнить().Выбрать(); ПредопределенныеЗначения = Новый Соответствие; Пока Выборка.Следующий() Цикл ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных; ПредопределенныеЗначения.Вставить(ИмяПредопределенного, Выборка.Ссылка); КонецЦикла; Возврат ПредопределенныеЗначения; КонецФункции // Возвращает признак использования в информационной базе полного РИБ (без фильтров). // Проверка выполняется по более точному алгоритму, если используется подсистема «Обмен данными». // // Параметры: // ФильтрПоНазначению — Строка — Уточняет, наличие какого РИБ проверяется. // Допустимые значения: // — Пустая строка — любого РИБ // — «СФильтром» — РИБ с фильтром // — «Полный» — РИБ без фильтров. // // Возвращаемое значение: Булево. // Функция ИспользуетсяРИБ(ФильтрПоНазначению = «») Экспорт Если УзлыРИБ(ФильтрПоНазначению).Количество() > 0 Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции // Возвращает список используемых в информационной базе узлов РИБ (без фильтров). // Проверка выполняется по более точному алгоритму, если используется подсистема «Обмен данными». // // Параметры: // ФильтрПоНазначению — Строка — Задает назначение узлов планов обмена РИБ, которые необходимо вернуть. // Допустимые значения: // — Пустая строка — будут возвращены все узлы РИБ // — «СФильтром» — будут возвращены узлы РИБ с фильтром // — «Полный» — будут возвращены узлы РИБ без фильтров. // // Возвращаемое значение: СписокЗначений. // Функция УзлыРИБ(ФильтрПоНазначению = «») Экспорт ФильтрПоНазначению = ВРег(ФильтрПоНазначению); СписокУзлов = Новый СписокЗначений; ПланыОбменаРИБ = ПланыОбменаРИБ(); Запрос = Новый Запрос(); Для Каждого ИмяПланаОбмена Из ПланыОбменаРИБ Цикл Если ЗначениеЗаполнено(ФильтрПоНазначению) И ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ОбменДанными») Тогда ОбщийМодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль(«ОбменДаннымиСервер»); НазначениеРИБ = ВРег(ОбщийМодульОбменДаннымиСервер.НазначениеПланаОбмена(ИмяПланаОбмена)); Если ФильтрПоНазначению = «СФИЛЬТРОМ» И НазначениеРИБ <> «РИБСФИЛЬТРОМ» Или ФильтрПоНазначению = «ПОЛНЫЙ» И НазначениеРИБ <> «РИБ» Тогда Продолжить; КонецЕсли; КонецЕсли; Запрос.Текст = «ВЫБРАТЬ | ПланОбмена.Ссылка КАК Ссылка |ИЗ | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена |ГДЕ | НЕ ПланОбмена.ЭтотУзел | И НЕ ПланОбмена.ПометкаУдаления»; Запрос.Текст = СтрЗаменить(Запрос.Текст, «[ИмяПланаОбмена]», ИмяПланаОбмена); ВыборкаУзлов = Запрос.Выполнить().Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл СписокУзлов.Добавить(ВыборкаУзлов.Ссылка); КонецЦикла; КонецЦикла; Возврат СписокУзлов; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Использование идентификаторов объектов метаданных конфигурации и расширений. // Только для внутреннего использования. Функция ОтключитьИдентификаторыОбъектовМетаданных() Экспорт ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности(); Если НЕ ОбщиеПараметры.ОтключитьИдентификаторыОбъектовМетаданных Тогда Возврат Ложь; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ВариантыОтчетов») ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки») ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.РассылкаОтчетов») ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.УправлениеДоступом») Тогда ВызватьИсключение НСтр(«ru = ‘Невозможно отключить справочник Идентификаторы объектов метаданных, |если используется любая из следующих подсистем: |- ВариантыОтчетов, |- ДополнительныеОтчетыИОбработки, |- РассылкаОтчетов, |- УправлениеДоступом.’»); КонецЕсли; Возврат Истина; КонецФункции // Только для внутреннего использования. Функция ИдентификаторыОбъектовМетаданныхПроверкаИспользования(ПроверитьОбновление = Ложь, ОбъектыРасширений = Ложь) Экспорт Справочники.ИдентификаторыОбъектовМетаданных.ПроверкаИспользования(ОбъектыРасширений); Если ПроверитьОбновление Тогда Справочники.ИдентификаторыОбъектовМетаданных.ДанныеОбновлены(Истина, ОбъектыРасширений); КонецЕсли; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с обменом данными. // Возвращает список планов обмена РИБ. // Если конфигурация работает в модели сервиса, // то возвращает список разделенных планов обмена РИБ. // Функция ПланыОбменаРИБ() Экспорт Результат = Новый Массив; Если ОбщегоНазначения.РазделениеВключено() Тогда Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл Если Лев(ПланОбмена.Имя, 7) = «Удалить» Тогда Продолжить; КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.РаботаВМоделиСервиса») Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль(«РаботаВМоделиСервиса»); ЭтоРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных( ПланОбмена.ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()); Иначе ЭтоРазделенныеДанные = Ложь; КонецЕсли; Если ПланОбмена.РаспределеннаяИнформационнаяБаза И ЭтоРазделенныеДанные Тогда Результат.Добавить(ПланОбмена.Имя); КонецЕсли; КонецЦикла; Иначе Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл Если Лев(ПланОбмена.Имя, 7) = «Удалить» Тогда Продолжить; КонецЕсли; Если ПланОбмена.РаспределеннаяИнформационнаяБаза Тогда Результат.Добавить(ПланОбмена.Имя); КонецЕсли; КонецЦикла; КонецЕсли; Возврат Результат; КонецФункции // Определяет режим регистрации данных на узлах плана обмена. // // Параметры: // ПолноеИмяОбъекта — Строка — Полное имя проверяемого объекта метаданных. // ИмяПланаОбмена — Строка — Проверяемый план обмена. // // Возвращаемое значение: // Неопределено — объект не включен в состав плана обмена, // «АвторегистрацияВключена» — объект включен в состав плана обмена, авторегистрация включена, // «АвторегистрацияОтключена» — объект включен в состав плана обмена, авторегистрация отключена, // объекты обрабатываются при создания начального образа РИБ. // «ПрограммнаяРегистрация» — объект включен в состав плана обмена, авторегистрация отключена, // регистрация осуществляется программно с помощью подписок на события, // объекты обрабатываются при создания начального образа РИБ. // Функция РежимРегистрацииДанныхДляПланаОбмена(ПолноеИмяОбъекта, ИмяПланаОбмена) Экспорт ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); ЭлементСоставаПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(ОбъектМетаданных); Если ЭлементСоставаПланаОбмена = Неопределено Тогда Возврат Неопределено; ИначеЕсли ЭлементСоставаПланаОбмена.Авторегистрация = АвторегистрацияИзменений.Разрешить Тогда Возврат «АвторегистрацияВключена»; КонецЕсли; // Анализ подписок на события для более сложных вариантов использования, // когда механизм платформенной авторегистрации отключен для объекта метаданных. Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл НачалоНазванияПодписки = ИмяПланаОбмена + «Регистрация»; Если ВРег(Лев(Подписка.Имя, СтрДлина(НачалоНазванияПодписки))) = ВРег(НачалоНазванияПодписки) Тогда Для каждого Тип Из Подписка.Источник.Типы() Цикл Если ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип) Тогда Возврат «ПрограммнаяРегистрация»; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Возврат «АвторегистрацияОтключена»; КонецФункции #КонецОбласти #Область СлужебныеПроцедурыИФункции // Возвращает соответствие имен «функциональных» подсистем и значения Истина. // У «функциональной» подсистемы снят флажок «Включать в командный интерфейс». // Функция ИменаПодсистем() Экспорт ОтключенныеПодсистемы = Новый Соответствие; ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем(ОтключенныеПодсистемы); Имена = Новый Соответствие; ВставитьИменаПодчиненныхПодсистем(Имена, Метаданные, ОтключенныеПодсистемы); Возврат Новый ФиксированноеСоответствие(Имена); КонецФункции // Проверяет наличие механизма платформы, предупреждающего об опасных действиях. // // Возвращаемое значение: // Булево — если Истина, тогда работает механизм предупреждений безопасности. // Функция ЕстьЗащитаОтОпасныхДействий() Экспорт Свойства = Новый Структура(«ЗащитаОтОпасныхДействий, UnsafeOperationProtection»); ЗаполнитьЗначенияСвойств(Свойства, ПользователиИнформационнойБазы.ТекущийПользователь()); Возврат Свойства.ЗащитаОтОпасныхДействий <> Неопределено Или Свойства.UnsafeOperationProtection <> Неопределено; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Для справочника ИдентификаторыОбъектовМетаданных. // Только для внутреннего использования. Функция ИдентификаторОбъектаМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных) Экспорт Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданныхПоПолномуИмени( ПолноеИмяОбъектаМетаданных); КонецФункции // Только для внутреннего использования. Функция ТаблицаПереименованияДляТекущейВерсии() Экспорт Возврат Справочники.ИдентификаторыОбъектовМетаданных.ТаблицаПереименованияДляТекущейВерсии(); КонецФункции // Только для внутреннего использования. Функция СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений = Ложь) Экспорт Возврат Справочники.ИдентификаторыОбъектовМетаданных.СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений); КонецФункции //////////////////////////////////////////////////////////////////////////////// // Работа с предопределенными данными. // Получает ссылку предопределенного элемента по его полному имени. // Подробнее — см. ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(); // Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного, ПривилегированныйРежим) Экспорт ИмяПредопределенного = ВРег(ПолноеИмяПредопределенного); Точка = СтрНайти(ИмяПредопределенного, «.»); ИмяКоллекции = Лев(ИмяПредопределенного, Точка 1); ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); Точка = СтрНайти(ИмяПредопределенного, «.»); ИмяТаблицы = Лев(ИмяПредопределенного, Точка 1); ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1); ТекстЗапроса = «ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ &ПолноеИмяТаблицы ГДЕ ИмяПредопределенныхДанных = &ИмяПредопределенного»; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, «&ПолноеИмяТаблицы», ИмяКоллекции + «.» + ИмяТаблицы); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр(«ИмяПредопределенного», ИмяПредопределенного); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Возврат Результат.Выгрузить()[0].Ссылка; КонецЕсли; Возврат Неопределено; КонецФункции //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ Функция НовоеОписаниеПодсистемы() Описание = Новый Структура; Описание.Вставить(«Имя», «»); Описание.Вставить(«Версия», «»); Описание.Вставить(«ТребуемыеПодсистемы», Новый Массив); // Свойство устанавливается автоматически. Описание.Вставить(«ЭтоКонфигурация», Ложь); // Имя основного модуля библиотеки. // Может быть пустым для конфигурации. Описание.Вставить(«ОсновнойСерверныйМодуль», «»); // Режим выполнения отложенных обработчиков обновления. // По умолчанию Последовательно. Описание.Вставить(«РежимВыполненияОтложенныхОбработчиков», «Последовательно»); Описание.Вставить(«ПараллельноеОтложенноеОбновлениеСВерсии», «»); Возврат Описание; КонецФункции Процедура ВставитьИменаПодчиненныхПодсистем(Имена, РодительскаяПодсистема, ОтключенныеПодсистемы, ИмяРодительскойПодсистемы = «») Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл Если ТекущаяПодсистема.ВключатьВКомандныйИнтерфейс Тогда Продолжить; КонецЕсли; ИмяТекущейПодсистемы = ИмяРодительскойПодсистемы + ТекущаяПодсистема.Имя; Если ОтключенныеПодсистемы.Получить(ИмяТекущейПодсистемы) = Истина Тогда Продолжить; Иначе Имена.Вставить(ИмяТекущейПодсистемы, Истина); КонецЕсли; Если ТекущаяПодсистема.Подсистемы.Количество() = 0 Тогда Продолжить; КонецЕсли; ВставитьИменаПодчиненныхПодсистем(Имена, ТекущаяПодсистема, ОтключенныеПодсистемы, ИмяТекущейПодсистемы + «.»); КонецЦикла; КонецПроцедуры #КонецОбласти

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

Эта статья продолжает цикл статей «Первые шаги в разработке на 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 Files1cv88.3.4.437bin1cv8.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.

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

// Возвращает описания всех библиотек конфигурации, включая

// описание самой конфигурации.

//

Функция ОписанияПодсистем() Экспорт

МодулиПодсистем = Новый Массив;

МодулиПодсистем.Добавить(«ОбновлениеИнформационнойБазыБСП»);

ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистем(МодулиПодсистем);

ОписаниеКонфигурацииНайдено = Ложь;

ОписанияПодсистем = Новый Структура;

ОписанияПодсистем.Вставить(«Порядок», Новый Массив);

ОписанияПодсистем.Вставить(«ПоИменам», Новый Соответствие);

ВсеТребуемыеПодсистемы = Новый Соответствие;

Для Каждого ИмяМодуля Из МодулиПодсистем Цикл

Описание = НовоеОписаниеПодсистемы();

Модуль = ОбщегоНазначения.ОбщийМодуль(ИмяМодуля);

Модуль.ПриДобавленииПодсистемы(Описание);

Если ОписанияПодсистем.ПоИменам.Получить(Описание.Имя) <> Неопределено Тогда

ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

НСтр(«ru = ‘Ошибка при подготовке описаний подсистем:

|в описании подсистемы (см. процедуру %1.ПриДобавленииПодсистемы)

|указано имя подсистемы «»%2«», которое уже зарегистрировано ранее.’»),

ИмяМодуля, Описание.Имя);

ВызватьИсключение ТекстОшибки;

КонецЕсли;

Если Описание.Имя = Метаданные.Имя Тогда

ОписаниеКонфигурацииНайдено = Истина;

Описание.Вставить(«ЭтоКонфигурация», Истина);

Иначе

Описание.Вставить(«ЭтоКонфигурация», Ложь);

КонецЕсли;

Описание.Вставить(«ОсновнойСерверныйМодуль», ИмяМодуля);

ОписанияПодсистем.ПоИменам.Вставить(Описание.Имя, Описание);

// Настройка порядка подсистем с учетом порядка добавления основных модулей.

ОписанияПодсистем.Порядок.Добавить(Описание.Имя);

// Сборка всех требуемых подсистем.

Для каждого ТребуемаяПодсистема Из Описание.ТребуемыеПодсистемы Цикл

Если ВсеТребуемыеПодсистемы.Получить(ТребуемаяПодсистема) = Неопределено Тогда

ВсеТребуемыеПодсистемы.Вставить(ТребуемаяПодсистема, Новый Массив);

КонецЕсли;

ВсеТребуемыеПодсистемы[ТребуемаяПодсистема].Добавить(Описание.Имя);

КонецЦикла;

КонецЦикла;

// Проверка описания основной конфигурации.

Если ОписаниеКонфигурацииНайдено Тогда

Описание = ОписанияПодсистем.ПоИменам[Метаданные.Имя];

Если Описание.Версия <> Метаданные.Версия Тогда

ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

НСтр(«ru = ‘Ошибка при подготовке описаний подсистем:

|версия «»%2«» конфигурации «»%1«» (см. процедуру %3.ПриДобавленииПодсистемы)

|не совпадает с версией конфигурации в метаданных «»%4«».’»),

Описание.Имя,

Описание.Версия,

Описание.ОсновнойСерверныйМодуль,

Метаданные.Версия);

ВызватьИсключение ТекстОшибки;

КонецЕсли;

Иначе

ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

НСтр(«ru = ‘Ошибка при подготовке описаний подсистем:

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

|не найдено описание подсистемы, совпадающей с именем конфигурации «»%1«».’»),

Метаданные.Имя);

ВызватьИсключение ТекстОшибки;

КонецЕсли;

// Проверка наличия всех требуемых подсистем.

Для каждого КлючИЗначение Из ВсеТребуемыеПодсистемы Цикл

Если ОписанияПодсистем.ПоИменам.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

ЗависимыеПодсистемы = «»;

Для Каждого ЗависимаяПодсистема Из КлючИЗначение.Значение Цикл

ЗависимыеПодсистемы = Символы.ПС + ЗависимаяПодсистема;

КонецЦикла;

ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

НСтр(«ru = ‘Ошибка при подготовке описаний подсистем:

|не найдена подсистема «»%1«» требуемая для подсистем: %2.’»),

КлючИЗначение.Ключ,

ЗависимыеПодсистемы);

ВызватьИсключение ТекстОшибки;

КонецЕсли;

КонецЦикла;

// Настройка порядка подсистем с учетом зависимостей.

Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл

Имя = КлючИЗначение.Ключ;

Порядок = ОписанияПодсистем.Порядок.Найти(Имя);

Для каждого ТребуемаяПодсистема Из КлючИЗначение.Значение.ТребуемыеПодсистемы Цикл

ПорядокТребуемойПодсистемы = ОписанияПодсистем.Порядок.Найти(ТребуемаяПодсистема);

Если Порядок < ПорядокТребуемойПодсистемы Тогда

Взаимозависимость = ОписанияПодсистем.ПоИменам[ТребуемаяПодсистема

].ТребуемыеПодсистемы.Найти(Имя) <> Неопределено;

Если Взаимозависимость Тогда

НовыйПорядок = ПорядокТребуемойПодсистемы;

Иначе

НовыйПорядок = ПорядокТребуемойПодсистемы + 1;

КонецЕсли;

Если Порядок <> НовыйПорядок Тогда

ОписанияПодсистем.Порядок.Вставить(НовыйПорядок, Имя);

ОписанияПодсистем.Порядок.Удалить(Порядок);

Порядок = НовыйПорядок 1;

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецЦикла;

// Смещение описания конфигурации в конец массива.

Индекс = ОписанияПодсистем.Порядок.Найти(Метаданные.Имя);

Если ОписанияПодсистем.Порядок.Количество() > Индекс + 1 Тогда

ОписанияПодсистем.Порядок.Удалить(Индекс);

ОписанияПодсистем.Порядок.Добавить(Метаданные.Имя);

КонецЕсли;

Для Каждого КлючИЗначение Из ОписанияПодсистем.ПоИменам Цикл

КлючИЗначение.Значение.ТребуемыеПодсистемы =

Новый ФиксированныйМассив(КлючИЗначение.Значение.ТребуемыеПодсистемы);

ОписанияПодсистем.ПоИменам[КлючИЗначение.Ключ] =

Новый ФиксированнаяСтруктура(КлючИЗначение.Значение);

КонецЦикла;

ОписанияПодсистем.Порядок = Новый ФиксированныйМассив(ОписанияПодсистем.Порядок);

ОписанияПодсистем.ПоИменам = Новый ФиксированноеСоответствие(ОписанияПодсистем.ПоИменам);

Возврат Новый ФиксированнаяСтруктура(ОписанияПодсистем);

КонецФункции

// Возвращает Истина, если привилегированный режим был установлен

// при запуске с помощью параметра UsePrivilegedMode.

//

// Поддерживается только при запуске клиентских приложений

// (внешнее соединение не поддерживается).

//

Функция ПривилегированныйРежимУстановленПриЗапуске() Экспорт

УстановитьПривилегированныйРежим(Истина);

Возврат ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить(

«ПривилегированныйРежимУстановленПриЗапуске») = Истина;

КонецФункции

// Возвращает соответствие имен предопределенных значений ссылкам на них.

//

// Параметры:

// ПолноеИмяОбъектаМетаданных — Строка, например, «Справочник.ВидыНоменклатуры»,

// Поддерживаются только таблицы

// с предопределенными элементами:

// — Справочники,

// — Планы видов характеристик,

// — Планы счетов,

// — Планы видов расчета.

//

// Возвращаемое значение:

// Соответствие, где

// Ключ — Строка — имя предопределенного,

// Значение — Ссылка предопределенного.

//

Функция СсылкиПоИменамПредопределенных(ПолноеИмяОбъектаМетаданных) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

«ВЫБРАТЬ

| ТекущаяТаблица.Ссылка КАК Ссылка,

| ТекущаяТаблица.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных

|ИЗ

| &ТекущаяТаблица КАК ТекущаяТаблица

|ГДЕ

| ТекущаяТаблица.Предопределенный = ИСТИНА«;

Запрос.Текст = СтрЗаменить(Запрос.Текст, «&ТекущаяТаблица», ПолноеИмяОбъектаМетаданных);

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

ПредопределенныеЗначения = Новый Соответствие;

Пока Выборка.Следующий() Цикл

ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных;

ПредопределенныеЗначения.Вставить(ИмяПредопределенного, Выборка.Ссылка);

КонецЦикла;

Возврат ПредопределенныеЗначения;

КонецФункции

// Возвращает признак использования в информационной базе полного РИБ (без фильтров).

// Проверка выполняется по более точному алгоритму, если используется подсистема «Обмен данными».

//

// Параметры:

// ФильтрПоНазначению — Строка — Уточняет, наличие какого РИБ проверяется.

// Допустимые значения:

// — Пустая строка — любого РИБ

// — «СФильтром» — РИБ с фильтром

// — «Полный» — РИБ без фильтров.

//

// Возвращаемое значение: Булево.

//

Функция ИспользуетсяРИБ(ФильтрПоНазначению = «») Экспорт

Если УзлыРИБ(ФильтрПоНазначению).Количество() > 0 Тогда

Возврат Истина;

Иначе

Возврат Ложь;

КонецЕсли;

КонецФункции

// Возвращает список используемых в информационной базе узлов РИБ (без фильтров).

// Проверка выполняется по более точному алгоритму, если используется подсистема «Обмен данными».

//

// Параметры:

// ФильтрПоНазначению — Строка — Задает назначение узлов планов обмена РИБ, которые необходимо вернуть.

// Допустимые значения:

// — Пустая строка — будут возвращены все узлы РИБ

// — «СФильтром» — будут возвращены узлы РИБ с фильтром

// — «Полный» — будут возвращены узлы РИБ без фильтров.

//

// Возвращаемое значение: СписокЗначений.

//

Функция УзлыРИБ(ФильтрПоНазначению = «») Экспорт

ФильтрПоНазначению = ВРег(ФильтрПоНазначению);

СписокУзлов = Новый СписокЗначений;

ПланыОбменаРИБ = ПланыОбменаРИБ();

Запрос = Новый Запрос();

Для Каждого ИмяПланаОбмена Из ПланыОбменаРИБ Цикл

Если ЗначениеЗаполнено(ФильтрПоНазначению)

И ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ОбменДанными») Тогда

ОбщийМодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль(«ОбменДаннымиСервер»);

НазначениеРИБ = ВРег(ОбщийМодульОбменДаннымиСервер.НазначениеПланаОбмена(ИмяПланаОбмена));

Если ФильтрПоНазначению = «СФИЛЬТРОМ» И НазначениеРИБ <> «РИБСФИЛЬТРОМ»

Или ФильтрПоНазначению = «ПОЛНЫЙ» И НазначениеРИБ <> «РИБ» Тогда

Продолжить;

КонецЕсли;

КонецЕсли;

Запрос.Текст =

«ВЫБРАТЬ

| ПланОбмена.Ссылка КАК Ссылка

|ИЗ

| ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена

|ГДЕ

| НЕ ПланОбмена.ЭтотУзел

| И НЕ ПланОбмена.ПометкаУдаления»;

Запрос.Текст = СтрЗаменить(Запрос.Текст, «[ИмяПланаОбмена]», ИмяПланаОбмена);

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

Пока ВыборкаУзлов.Следующий() Цикл

СписокУзлов.Добавить(ВыборкаУзлов.Ссылка);

КонецЦикла;

КонецЦикла;

Возврат СписокУзлов;

КонецФункции

////////////////////////////////////////////////////////////////////////////////

// Использование идентификаторов объектов метаданных конфигурации и расширений.

// Только для внутреннего использования.

Функция ОтключитьИдентификаторыОбъектовМетаданных() Экспорт

ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности();

Если НЕ ОбщиеПараметры.ОтключитьИдентификаторыОбъектовМетаданных Тогда

Возврат Ложь;

КонецЕсли;

Если ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ВариантыОтчетов»)

ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки»)

ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.РассылкаОтчетов»)

ИЛИ ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.УправлениеДоступом») Тогда

ВызватьИсключение

НСтр(«ru = ‘Невозможно отключить справочник Идентификаторы объектов метаданных,

|если используется любая из следующих подсистем:

|- ВариантыОтчетов,

|- ДополнительныеОтчетыИОбработки,

|- РассылкаОтчетов,

|- УправлениеДоступом.’»);

КонецЕсли;

Возврат Истина;

КонецФункции

// Только для внутреннего использования.

Функция ИдентификаторыОбъектовМетаданныхПроверкаИспользования(ПроверитьОбновление = Ложь, ОбъектыРасширений = Ложь) Экспорт

Справочники.ИдентификаторыОбъектовМетаданных.ПроверкаИспользования(ОбъектыРасширений);

Если ПроверитьОбновление Тогда

Справочники.ИдентификаторыОбъектовМетаданных.ДанныеОбновлены(Истина, ОбъектыРасширений);

КонецЕсли;

КонецФункции

////////////////////////////////////////////////////////////////////////////////

// Процедуры и функции работы с обменом данными.

// Возвращает список планов обмена РИБ.

// Если конфигурация работает в модели сервиса,

// то возвращает список разделенных планов обмена РИБ.

//

Функция ПланыОбменаРИБ() Экспорт

Результат = Новый Массив;

Если ОбщегоНазначения.РазделениеВключено() Тогда

Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл

Если Лев(ПланОбмена.Имя, 7) = «Удалить» Тогда

Продолжить;

КонецЕсли;

Если ОбщегоНазначения.ПодсистемаСуществует(«СтандартныеПодсистемы.РаботаВМоделиСервиса») Тогда

МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль(«РаботаВМоделиСервиса»);

ЭтоРазделенныеДанные = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(

ПланОбмена.ПолноеИмя(), МодульРаботаВМоделиСервиса.РазделительОсновныхДанных());

Иначе

ЭтоРазделенныеДанные = Ложь;

КонецЕсли;

Если ПланОбмена.РаспределеннаяИнформационнаяБаза

И ЭтоРазделенныеДанные Тогда

Результат.Добавить(ПланОбмена.Имя);

КонецЕсли;

КонецЦикла;

Иначе

Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл

Если Лев(ПланОбмена.Имя, 7) = «Удалить» Тогда

Продолжить;

КонецЕсли;

Если ПланОбмена.РаспределеннаяИнформационнаяБаза Тогда

Результат.Добавить(ПланОбмена.Имя);

КонецЕсли;

КонецЦикла;

КонецЕсли;

Возврат Результат;

КонецФункции

// Определяет режим регистрации данных на узлах плана обмена.

//

// Параметры:

// ПолноеИмяОбъекта — Строка — Полное имя проверяемого объекта метаданных.

// ИмяПланаОбмена — Строка — Проверяемый план обмена.

//

// Возвращаемое значение:

// Неопределено — объект не включен в состав плана обмена,

// «АвторегистрацияВключена» — объект включен в состав плана обмена, авторегистрация включена,

// «АвторегистрацияОтключена» — объект включен в состав плана обмена, авторегистрация отключена,

// объекты обрабатываются при создания начального образа РИБ.

// «ПрограммнаяРегистрация» — объект включен в состав плана обмена, авторегистрация отключена,

// регистрация осуществляется программно с помощью подписок на события,

// объекты обрабатываются при создания начального образа РИБ.

//

Функция РежимРегистрацииДанныхДляПланаОбмена(ПолноеИмяОбъекта, ИмяПланаОбмена) Экспорт

ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта);

ЭлементСоставаПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(ОбъектМетаданных);

Если ЭлементСоставаПланаОбмена = Неопределено Тогда

Возврат Неопределено;

ИначеЕсли ЭлементСоставаПланаОбмена.Авторегистрация = АвторегистрацияИзменений.Разрешить Тогда

Возврат «АвторегистрацияВключена»;

КонецЕсли;

// Анализ подписок на события для более сложных вариантов использования,

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

Для каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл

НачалоНазванияПодписки = ИмяПланаОбмена + «Регистрация»;

Если ВРег(Лев(Подписка.Имя, СтрДлина(НачалоНазванияПодписки))) = ВРег(НачалоНазванияПодписки) Тогда

Для каждого Тип Из Подписка.Источник.Типы() Цикл

Если ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип) Тогда

Возврат «ПрограммнаяРегистрация»;

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

Возврат «АвторегистрацияОтключена»;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Возвращает соответствие имен «функциональных» подсистем и значения Истина.

// У «функциональной» подсистемы снят флажок «Включать в командный интерфейс».

//

Функция ИменаПодсистем() Экспорт

ОтключенныеПодсистемы = Новый Соответствие;

ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем(ОтключенныеПодсистемы);

Имена = Новый Соответствие;

ВставитьИменаПодчиненныхПодсистем(Имена, Метаданные, ОтключенныеПодсистемы);

Возврат Новый ФиксированноеСоответствие(Имена);

КонецФункции

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

//

// Возвращаемое значение:

// Булево — если Истина, тогда работает механизм предупреждений безопасности.

//

Функция ЕстьЗащитаОтОпасныхДействий() Экспорт

Свойства = Новый Структура(«ЗащитаОтОпасныхДействий, UnsafeOperationProtection»);

ЗаполнитьЗначенияСвойств(Свойства, ПользователиИнформационнойБазы.ТекущийПользователь());

Возврат Свойства.ЗащитаОтОпасныхДействий <> Неопределено

Или Свойства.UnsafeOperationProtection <> Неопределено;

КонецФункции

////////////////////////////////////////////////////////////////////////////////

// Для справочника ИдентификаторыОбъектовМетаданных.

// Только для внутреннего использования.

Функция ИдентификаторОбъектаМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных) Экспорт

Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданныхПоПолномуИмени(

ПолноеИмяОбъектаМетаданных);

КонецФункции

// Только для внутреннего использования.

Функция ТаблицаПереименованияДляТекущейВерсии() Экспорт

Возврат Справочники.ИдентификаторыОбъектовМетаданных.ТаблицаПереименованияДляТекущейВерсии();

КонецФункции

// Только для внутреннего использования.

Функция СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений = Ложь) Экспорт

Возврат Справочники.ИдентификаторыОбъектовМетаданных.СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений);

КонецФункции

////////////////////////////////////////////////////////////////////////////////

// Работа с предопределенными данными.

// Получает ссылку предопределенного элемента по его полному имени.

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

//

Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного, ПривилегированныйРежим) Экспорт

ИмяПредопределенного = ВРег(ПолноеИмяПредопределенного);

Точка = СтрНайти(ИмяПредопределенного, «.»);

ИмяКоллекции = Лев(ИмяПредопределенного, Точка 1);

ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1);

Точка = СтрНайти(ИмяПредопределенного, «.»);

ИмяТаблицы = Лев(ИмяПредопределенного, Точка 1);

ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1);

ТекстЗапроса = «ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ &ПолноеИмяТаблицы ГДЕ ИмяПредопределенныхДанных = &ИмяПредопределенного»;

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, «&ПолноеИмяТаблицы», ИмяКоллекции + «.» + ИмяТаблицы);

Запрос = Новый Запрос(ТекстЗапроса);

Запрос.УстановитьПараметр(«ИмяПредопределенного», ИмяПредопределенного);

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Возврат Результат.Выгрузить()[0].Ссылка;

КонецЕсли;

Возврат Неопределено;

КонецФункции

////////////////////////////////////////////////////////////////////////////////

// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

Функция НовоеОписаниеПодсистемы()

Описание = Новый Структура;

Описание.Вставить(«Имя», «»);

Описание.Вставить(«Версия», «»);

Описание.Вставить(«ТребуемыеПодсистемы», Новый Массив);

// Свойство устанавливается автоматически.

Описание.Вставить(«ЭтоКонфигурация», Ложь);

// Имя основного модуля библиотеки.

// Может быть пустым для конфигурации.

Описание.Вставить(«ОсновнойСерверныйМодуль», «»);

// Режим выполнения отложенных обработчиков обновления.

// По умолчанию Последовательно.

Описание.Вставить(«РежимВыполненияОтложенныхОбработчиков», «Последовательно»);

Описание.Вставить(«ПараллельноеОтложенноеОбновлениеСВерсии», «»);

Возврат Описание;

КонецФункции

Процедура ВставитьИменаПодчиненныхПодсистем(Имена, РодительскаяПодсистема, ОтключенныеПодсистемы, ИмяРодительскойПодсистемы = «»)

Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл

Если ТекущаяПодсистема.ВключатьВКомандныйИнтерфейс Тогда

Продолжить;

КонецЕсли;

ИмяТекущейПодсистемы = ИмяРодительскойПодсистемы + ТекущаяПодсистема.Имя;

Если ОтключенныеПодсистемы.Получить(ИмяТекущейПодсистемы) = Истина Тогда

Продолжить;

Иначе

Имена.Вставить(ИмяТекущейПодсистемы, Истина);

КонецЕсли;

Если ТекущаяПодсистема.Подсистемы.Количество() = 0 Тогда

Продолжить;

КонецЕсли;

ВставитьИменаПодчиненныхПодсистем(Имена, ТекущаяПодсистема, ОтключенныеПодсистемы, ИмяТекущейПодсистемы + «.»);

КонецЦикла;

КонецПроцедуры

#КонецОбласти

При моделировании информации, рассказанной по данному теме , столкнулся с проблемой, которая не освещена ни в курсе, ни в данной ветке обсуждения… Проблему решил – хочу поделится решением (в случае, если кто то так же столкнулся с данной проблемой) при реализации “тесного внедрения БСП 2.1.9.2.” и настройки синхронизации на стороне базы, используюйще УФ (т.е. уже имеющей внедренный БСП)

Ошибка выполнения созданного и настроенного обмена на стороне Базы приемника – при использовании БСП 2.1.9.2 в базе источнике (стоит отметит, что с базой источником проблематика не связана):


{ОбщийМодуль.ОбщегоНазначения.Модуль(2954)}: Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных().

Для объекта метаданных “ПланОбмена.ОбменИсходнаяБухгалтерия3”
не найден идентификатор
в справочнике “Идентификаторы объектов метаданных”.

Для разработчика: возможно требуется обновить вспомогательные данные,
которые влияют на работу программы. Для выполнения обновления можно:
– воспользоваться внешней обработкой
“Инструменты разработчика: Обновление вспомогательных данных”,
– либо запустить программу с параметром командной строки 1С:Предприятия 8
“/С ЗапуститьОбновлениеИнформационнойБазы”,
– либо увеличить номер версии конфигурации, чтобы при очередном запуске
выполнились процедуры обновления данных информационной базы.
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

Решение, которое мне помогло:

1. В “ПланОбмена” – в обоих программах = Добавить реквизит “ИспользоватьОтборПоОрганизации” – без этого происходит ошибка проверки данного реквизита.

2. В “ПланОбмена” БП3 – добавить Макет “ПравилаОбменаКорреспондента”, заполнив его текстом правил обмена из БазыИсточника (откуда данные идет в БП3). Если этого не сделать – происходит ошибка проверки всех требуемых условий для добавленния данных о ПланеОбмена в Регистр “Правила для обмена данными” – т.к. для добавления ТРЕБУЕТСЯ иметь оба эти макета… Ошибка происходит в функции “ВыполнитьОбновлениеВерсииТиповыхПравилДляОбменаДанными” = в общем модуле “ОбменДаннымиСервер”.

3. Создать внешнюю обработку для “ручного” обновления информации в справочнике “ИдентификаторыОбъектовМетаданных” – со следующим кодом (выполнение на сервере без контекста):

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

32 Comments

  1. Спасибо за сведения. В РИБ была аналогичная ошибка

    «Справочник.УдалитьСтатусыНалогоплательщиковПоНДФЛ.Резидент. Предопределенный элемент отсутствует в данных»

    Изменил предложенный код и всё получилось

    СсылкаНаОбъект=Справочники.УдалитьСтатусыНалогоплательщиковПоНДФЛ;

    ОбновляемыйОбъект = СсылкаНаОбъект.СоздатьЭлемент();// .ПолучитьОбъект();

    ОбновляемыйОбъект.ИмяПредопределенныхДанных = «Резидент»;

    ОбновляемыйОбъект.Наименование= «Резидент»;

    ОбновляемыйОбъект.ОбменДанными.Загрузка = Истина;

    ОбновляемыйОбъект.Записать();

    Reply

  2. Хорошая статья. Помогла.

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

    Вариант — отстутствие главного узла не проходит.

    Не пробовал правда саму базу сделать на время главной.

    Reply

  3. (3) capitan, Зависит от свойства «Обновление предопределеныых данных» конкретного справочника.

    Если «Авто», то в подчиненных базах предопределенные элементы создаваться не будут. Должны прийти с обменом.

    Если «обновлять автоматически», то всегда будут создаваться.

    Reply

  4. (4) Не поняли мой вопрос.

    Откуда база узнает ,что она периферийная ?

    Вариант — отстутствие главного узла не проходит.

    Удалял главный узел, все равно предопределенные элементы не создаются.

    Т.е. база еще где то помнит, что она была периферийной.

    Reply

  5. (5) capitan, Теоретически должны пересоздаться при следующем обновлении конфигурации.

    Т.е. отключить от центрального узла и что-то изменить в конфигурации (банально пробел где-то добавить)

    Либо запустить с ключем /SetPredefinedDataUpdate

    Еще зависит от конфигурации.

    Может быть программно установлен другой режим обновления методом УстановитьОбновлениеПредопределенныхДанных()

    Reply

  6. Спасибо хорошая статейка, и обработка помогла

    Reply

  7. Полезная статья, спасибо!

    Reply

  8. Очень вовремя, спасибо!

    Обработка как раз кстати…

    Reply

  9. По поводу «самого простого способа №1»

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

    Reply

  10. (10) dsp123, Что имеется в виду под «Не видны»?

    Если они есть в базе, то их просто нужно выбрать.

    Если нету, то создать элементы в базе и привязать.

    Reply

  11. Здравствуйте! Ребят подскажите что можно сделать. В плане счетов ЕПСБУ в счете 104.36 появилась галочка «Нет учета по КПС» хотя галочки «Заболансовый» нет, при попытке изменить выдает сообщение что предопределенный элемент не уникален. Я не особый специалист 1С, я только учусь, по этому прошу вашей помощи!

    Reply

  12. (12) Tolyasik, Как раз об этом второй раздел данной статьи

    2. «Предопределенный элемент не уникален» — задвоенные предопределенные элементы:

    Несколько элементов ИБ привязаны к одному предопределенному в конфигурации.

    Эти проблемы отлично решает обработка

    http://infostart.ru/public/305892/

    Reply

  13. Добрый день!

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

    А почему такая ошибка возникает в запросе, в типовом ЗУП 3.0?

    Я добавил в справочник «ПоказателиРасчетаЗарплаты» новый предопределенный элемент, и теперь выскакивает соответствующая ошибка.

    Общий модуль «СтандартныеПодсистемыПовтИсп», функция «ПредопределенныйЭлемент()», текст запроса:

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

    ————————————

    Вопрос снят. Протупил. В запрос передавалось неправильное имя предопределенного.

    Reply

  14. (14) Spacer, столкнулся с аналогичной ситуацией. хоть убей не понимаю, почему это должно вызывать ошибку, а не просто пустой результат запроса, как при поиске по любому другому реквизиту строкового типа. бред какой-то…

    Reply

  15. Добрый день! В бух. 3.0 Что то случилось со справочником ВидыКонтактнойИнформации. Когда открываешь справочник, то он пуст. Скачала Вашу обработку, но она видит все предопределенные элементы справочника и ошибок не находит. При этом в любом справочнике, где используется контактная информация ни адрес ни телефон заполнить нет возможности, просто нет гиперссылок. Может вы встречались с такой ситуацией и можете что то посоветовать? Бьюсь уже 2 дня.

    Reply

  16. Спасибо! очень помогло…ошибка возникла в справочнике «Страны Мира»

    Reply

  17. (2) Спасибо, и у меня получилось, хотя то же пришлось поправить…:

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

    Показать

    Reply

  18. У нас, в ЗУП 2.5, после очередного обновления конфы потребовалось перейти на 8.3. Это было в середине марта. И вот вчера обнаружилось что в документе «Начисление страховых взносов» перестали рассчитываться ФСС НС и ПЗ. Колонка ФСС заполняется, а ФСС НС и ПЗ — нет.

    Два дня искал причину и нашёл — в справочнике ДоходыПоСтраховыхВзносам в предопределенном элементе «ОблагаетсяЦеликом» значение реквизита ВходитВБазуФСС_НС стало Ложь.

    Что характерно у нас несколько баз ЗУП. И в двух из них всё в порядке, а в остальных такое вот.

    Почему? Мне вот не понятно.

    Reply

  19. Благодарю автора за статью.

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

    При чем реквизиты создаваемого элемента «оплата от покупателя» ДОЛЖНЫ быть заполнены в точности, как в демо базе, по крайней мере в нашем случае ВидОперации должен был быть правильно заполнен.

    Reply

  20. Добрый день) Видимо, я что-то недопонимаю, хотя в 1С работаю уже не 1-й год. Нет у меня в справочнике свойства ИмяПредопределенныхДанных через запрос. Вот код:

    Процедура ()

    Об=Справочники.Автоработы.НайтиПоКоду(«ЦБ000000373»).ПолучитьОбъект();

    Об.ИмяПредопределенныхДанных=»ОсмотрАвтомобиля»;

    Об.Записать();

    КонецПроцедуры

    Ругается:

    Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    Откуда вы видите это свойство в справочнике?

    Reply

  21. (21)

    Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    Прямо вот точно так ругается? Или может там другая формулировка.

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

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

    В качестве примера:

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

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

    Показать

    Reply

  22. Полностью Скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    Reply

  23. Полностью скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    Reply

  24. Полностью скопировала код. Вот такое сообщение выходит:

    {ВнешнийОтчет.ВнешнийОтчет1.Форма.ФормаОтчета.Форма(3126)}: Поле объекта не обнаружено (ИмяПредопределенныхДанных)

    НовыйПредопределенныйЭлемент.ИмяПредопределенныхДанных = «ОсмотрАвтомобиля»;

    (22)

    Reply

  25. (25) версия платформы и режим совместимости?

    В самой публикации в самом начале указано: «В 8.3.3».

    Reply

  26. 8.3.10.2580, режим совместимости: 8.2.16

    Reply

  27. (27)

    режим совместимости: 8.2.16

    Вот и ответ. В 8.2 нет этого функционала.

    Reply

  28. (28) Ок, спасибо)))

    Reply

  29. Спасибо за статью!

    Добавлю что в типовых ЗУП 3.1 и БУХ 3 есть функция для получения ссылки предопределенного элемента по его полному имени

    Например:

    ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(«Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы»)

    // Возвращаемое значение:

    // ЛюбаяСсылка — ссылка на предопределенный элемент.

    // Неопределено — если предопределенный есть в метаданных, но не создан в ИБ.

    При ее использовании не будет происходит ошибка «»Предопределенный элемент отсутствует в данных»», как при прямом обращении к предопределенному элементу например «Справочник.ВидыИспользованияРабочегоВремени.РаботаВечерниеЧасы»

    в том случае, например, если в базе не используются «Вечерние часы» и элемент в ИБ не был поэтому целенаправленно создан.

    Reply

  30. вставлю 5 копеек для плана счетов (ругалось при обновлении на 65ый БП3)

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

    Показать

    Reply

  31. Спасибо, статья помогла. В БП3 в конфигураторе у справочника СтатьиЗатрат есть предопределенное значение «КомандировочныеРасходы» в режиме 1С Предприятия, такого элемента не было. Пришлось добавлять элемент, используя ваш код.

    Reply

Leave a Comment

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

  • Синтаксическая ошибка непредвиденный токен требуется выражение
  • Синтаксическая ошибка неожиданный символ после символа продолжения строки
  • Синтаксическая ошибка неожиданный конец файла bash
  • Синтаксическая ошибка незавершенный список параметров
  • Синтаксическая ошибка на телевизоре андроид