Алгоритм не работает без вызова Сообщить()

1. Климов Сергей 20.05.19 18:08 Сейчас в теме
КД2. Пишу правила конвертации из древней УТ 9.0 в КА 2.0. В УТ активно используется механизм
свойств номенклатуры. Это прообраз нынешних дополнительных реквизитов. Проблема возникла с
конвертацией свойств в дополнительные реквизиты. Специфика задачи в том, что часть свойств
нужно сконвертировать в реквизиты общие для всей номенклатуры, а часть - в специфичные для вида
номенклатуры. Для этого, среди прочего, в процессе загрузки необходимо формировать табличную
часть "Дополнительные реквизиты" справочника "Наборы дополнительных реквизитов и сведений".
Для общих реквизитов номенклатуры в этом справочнике есть предопределённый элемент, нужно только
заполнить ТЧ. А для реквизитов видов номенклатуры надо создавать элемент и также заполнять ТЧ.
Создано два вида ПКО: ДополнительныеРеквизитыИСведенияНоменклатурыОбщие - для общих реквизитов
и ДополнительныеРеквизитыИСведенияНоменклатурыКниги - для вида номенклатуры "Книги". В обоих ПКО, в
обработчике ПослеЗагрузки написан следующий код:
Параметры.ПараметрыАлгоритмов.Очистить();
Параметры.ПараметрыАлгоритмов.Вставить("Объект", Объект);
Выполнить(Алгоритмы.ЗаписатьДополнительныйРеквизитВНабор);

Сам алгоритм:
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
    //добавим реквизит в набор
    СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
    СтрНаборОб.Свойство = Ссылка;
КонецЕсли;
Если НаборОб.Модифицированность() Тогда
    сообщить("Записываем");
    //запишем при необходимости
    НаборОб.Записать();
КонецЕсли;
Показать

В таком виде алгоритм работает корректно, записывает и общий набор и набор "Книги". Но стоит убрать
(или закомментировать) операторы Сообщить(), как перестаёт работать запись общего набора. Причём
набор для книг продолжает записываться. Загрузка происходит в режиме обмена, следовательно
обработчики справочника ПередЗаписью и ПриЗаписи не работают. Оставлять отладочную выдачу
не хочется: это дурной тон, да и выгружать предстоит десятки тысяч элементов, на эту выдачу
уйдёт вагон времени.
В чём может быть причина такого мистического поведения?

КА 2.4.7.141, КД 2.1.8.1, платформа 8.3.13.1513, MS SQL.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. tusv 210 20.05.19 18:27 Сейчас в теме
(1) Мей би ну его нафиг модифицированность?
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Пишем = Ложь;
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
    //добавим реквизит в набор
    СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
    СтрНаборОб.Свойство = Ссылка;
   Пишем = Истина;
КонецЕсли;
Если Пишем Тогда
    сообщить("Записываем");
    //запишем при необходимости
    НаборОб.Записать();
КонецЕсли;
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. tusv 210 20.05.19 18:27 Сейчас в теме
(1) Мей би ну его нафиг модифицированность?
Объект = Параметры.ПараметрыАлгоритмов.Объект;
//проверим, что реквизит указан в наборе доп. реквизитов номенклатуры
НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);
Пишем = Ложь;
Если НаборОб.ДополнительныеРеквизиты.Найти(Ссылка, "Свойство") = Неопределено Тогда
    //добавим реквизит в набор
    СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
    СтрНаборОб.Свойство = Ссылка;
   Пишем = Истина;
КонецЕсли;
Если Пишем Тогда
    сообщить("Записываем");
    //запишем при необходимости
    НаборОб.Записать();
КонецЕсли;
Показать
10. Климов Сергей 21.05.19 09:33 Сейчас в теме
(2) Бинго! Проблема была именно в Модифицированости. Спасибо большое! :)
13. tusv 210 21.05.19 12:53 Сейчас в теме
(10)Добро пожаловать в мир УФ, где есть четкая "Цветовая дифференциация штанов" между клиентом и сервером
5. ksen 21.05.19 08:05 Сейчас в теме
(1)Какой из сообщить влияет?
8. tusv 210 21.05.19 09:23 Сейчас в теме
(1)Кстати о птичках. То есть КД
Объект = Параметры.ПараметрыАлгоритмов.Объект;

Вы здесь переопределили Объект. Как 1с не наругалось при этом. Пока не знаю. Наверное один объект переносите
11. Климов Сергей 21.05.19 09:35 Сейчас в теме
(8) Спасибо за предупреждение, проверю. Пока да, на одном объекте тренируюсь.
12. tusv 210 21.05.19 09:55 Сейчас в теме
(11)Обращайтесь. Работа такая:)
3. palsergeich 20.05.19 22:17 Сейчас в теме
Соглашусь с предыдущим оратором по поводу модифицированности - я пока в коде ни разу не видел использования этого метода.
4. ZergKRSK 129 21.05.19 04:29 Сейчас в теме
(3) да полно встречается в типовых, по крайней мере на ОФ.
7. tusv 210 21.05.19 09:11 Сейчас в теме
(4)Код в студию, если встречали. Не поленюсь настучать по голове 1С эсовцам.
Их хто учил программировать, когда папа Карло, а когда никто?
Чел с объектом работает, а не с формой
9. ZergKRSK 129 21.05.19 09:29 Сейчас в теме
(7) Модифицированность() же метод не только формы или объекта дока. В наборах записей регистров часто используется:
Если НаборЗаписейБазаРаспределенияЗатрат.Модифицированность() Тогда
		НаборЗаписейБазаРаспределенияЗатрат.Записать(Ложь);
	КонецЕсли;
6. VmvLer 21.05.19 09:09 Сейчас в теме
Вероятно

НаборОб = Объект.НаборСвойств.ПолучитьОбъект();
Сообщить("НаборОб = " + НаборОб);

логичнее было бы
Сообщить("НаборОб = " + Строка(НаборОб))


и вообще непонятно как система делает в авторском случае неявное преобразование в подстроку НаборОб,
но то, что при этом преобразовании выполняется чтение из БД это точно.
Возможно эта алогичность и дает костыльный результат.
14. Oldsad 23.05.19 03:47 Сейчас в теме
(6)
Сообщить("НаборОб = " + НаборОб)

Сообщить("НаборОб = " + Строка(НаборОб))

эти две строки когда эквивалентны
поэтому непонятно как одна логичнее другой
15. Rish_a 22 23.05.19 12:04 Сейчас в теме
Нет смысла на проверку модифицированности.
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Санкт-Петербург
зарплата от 100 руб. до 150 руб.
Полный день