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

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

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

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


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

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

эти две строки когда эквивалентны
поэтому непонятно как одна логичнее другой
15. Rish_a 20 23.05.19 12:04 Сейчас в теме
Нет смысла на проверку модифицированности.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист 1С
Ижевск
зарплата от 70 000 руб. до 94 000 руб.
Полный день

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

Программист 1С
Санкт-Петербург
Полный день

Консультант 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день