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С
Бобров
зарплата от 100 000 руб. до 150 000 руб.
Временный (на проект)

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

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

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

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день