Алгоритм не работает без вызова Сообщить()
КД2. Пишу правила конвертации из древней УТ 9.0 в КА 2.0. В УТ активно используется механизм
свойств номенклатуры. Это прообраз нынешних дополнительных реквизитов. Проблема возникла с
конвертацией свойств в дополнительные реквизиты. Специфика задачи в том, что часть свойств
нужно сконвертировать в реквизиты общие для всей номенклатуры, а часть - в специфичные для вида
номенклатуры. Для этого, среди прочего, в процессе загрузки необходимо формировать табличную
часть "Дополнительные реквизиты" справочника "Наборы дополнительных реквизитов и сведений".
Для общих реквизитов номенклатуры в этом справочнике есть предопределённый элемент, нужно только
заполнить ТЧ. А для реквизитов видов номенклатуры надо создавать элемент и также заполнять ТЧ.
Создано два вида ПКО: ДополнительныеРеквизитыИСведенияНоменклатурыОбщие - для общих реквизитов
и ДополнительныеРеквизитыИСведенияНоменклатурыКниги - для вида номенклатуры "Книги". В обоих ПКО, в
обработчике ПослеЗагрузки написан следующий код:
Сам алгоритм:
В таком виде алгоритм работает корректно, записывает и общий набор и набор "Книги". Но стоит убрать
(или закомментировать) операторы Сообщить(), как перестаёт работать запись общего набора. Причём
набор для книг продолжает записываться. Загрузка происходит в режиме обмена, следовательно
обработчики справочника ПередЗаписью и ПриЗаписи не работают. Оставлять отладочную выдачу
не хочется: это дурной тон, да и выгружать предстоит десятки тысяч элементов, на эту выдачу
уйдёт вагон времени.
В чём может быть причина такого мистического поведения?
КА 2.4.7.141, КД 2.1.8.1, платформа 8.3.13.1513, MS SQL.
свойств номенклатуры. Это прообраз нынешних дополнительных реквизитов. Проблема возникла с
конвертацией свойств в дополнительные реквизиты. Специфика задачи в том, что часть свойств
нужно сконвертировать в реквизиты общие для всей номенклатуры, а часть - в специфичные для вида
номенклатуры. Для этого, среди прочего, в процессе загрузки необходимо формировать табличную
часть "Дополнительные реквизиты" справочника "Наборы дополнительных реквизитов и сведений".
Для общих реквизитов номенклатуры в этом справочнике есть предопределённый элемент, нужно только
заполнить ТЧ. А для реквизитов видов номенклатуры надо создавать элемент и также заполнять ТЧ.
Создано два вида ПКО: ДополнительныеРеквизитыИСведенияНоменклатурыОбщие - для общих реквизитов
и ДополнительныеРеквизитыИСведенияНоменклатурыКниги - для вида номенклатуры "Книги". В обоих ПКО, в
обработчике ПослеЗагрузки написан следующий код:
Параметры.ПараметрыАлгоритмов.Очистить();
Параметры.ПараметрыАлгоритмов.Вставить("Объект", Объект);
Выполнить(Алгоритмы.ЗаписатьДополнительныйРеквизитВНабор);
Сам алгоритм:
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
СтрНаборОб.Свойство = Ссылка;
КонецЕсли;
Если НаборОб.Модифицированность() Тогда
сообщить("Записываем");
//запишем при необходимости
НаборОб.Записать();
КонецЕсли;
ПоказатьВ таком виде алгоритм работает корректно, записывает и общий набор и набор "Книги". Но стоит убрать
(или закомментировать) операторы Сообщить(), как перестаёт работать запись общего набора. Причём
набор для книг продолжает записываться. Загрузка происходит в режиме обмена, следовательно
обработчики справочника ПередЗаписью и ПриЗаписи не работают. Оставлять отладочную выдачу
не хочется: это дурной тон, да и выгружать предстоит десятки тысяч элементов, на эту выдачу
уйдёт вагон времени.
В чём может быть причина такого мистического поведения?
КА 2.4.7.141, КД 2.1.8.1, платформа 8.3.13.1513, MS SQL.
По теме из базы знаний
- Разные хм... неожиданности при работе с УТ 11 и платформой
- Удержание СОМ-соединения между вызовами сервера
- Интеграция 1С с маркетплейсами из одного окна: Озон, ВБ, Яндекс, Сбер, Али, ЛаМода - для УНФ, УТ, КА, ERP
- Запуск фонового задания с прогрессом во внешней обработке независимо от места вызова на Библиотеке стандартных подсистем
- Реализация алгоритма Форда-Фалкерсона для решения задач оптимизации в среде 1С
Найденные решения
(1) Мей би ну его нафиг модифицированность?
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Пишем = Ложь;
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
СтрНаборОб.Свойство = Ссылка;
Пишем = Истина;
КонецЕсли;
Если Пишем Тогда
сообщить("Записываем");
//запишем при необходимости
НаборОб.Записать();
КонецЕсли;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Мей би ну его нафиг модифицированность?
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Пишем = Ложь;
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
СтрНаборОб.Свойство = Ссылка;
Пишем = Истина;
КонецЕсли;
Если Пишем Тогда
сообщить("Записываем");
//запишем при необходимости
НаборОб.Записать();
КонецЕсли;
Показать
Вероятно
логичнее было бы
и вообще непонятно как система делает в авторском случае неявное преобразование в подстроку НаборОб,
но то, что при этом преобразовании выполняется чтение из БД это точно.
Возможно эта алогичность и дает костыльный результат.
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
логичнее было бы
Сообщить("НаборОб = " + Строка(НаборОб))
и вообще непонятно как система делает в авторском случае неявное преобразование в подстроку НаборОб,
но то, что при этом преобразовании выполняется чтение из БД это точно.
Возможно эта алогичность и дает костыльный результат.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот