Имя: Пароль:
1C
1С v8
Работа функции ВыгрузитьПоПравилу
0 NikePopov
 
27.11.12
12:41
Добрый день, Господа.

Опять таки столкнулся с вопросами Конвертации данных. Вопрос примерно следующий:

Один и тот же объект может быть в зависимости от параметров и его реквизитов конвертирован по разному. Для этого использую конструкцию с подменой ИмяПКО:
Если Параметры.НоменклатураСветнуто Тогда
   ИмяПКО = "Продукты_Свернуто";
ИначеЕсли Константы.Питание_ДвижениеПоКалькуляции.Получить() Тогда
   ИмяПКО = "Продукты_Детально";
Иначе
   ИмяПКО = "Блюда_ПоНаименованию";
КонецЕсли;    
ПКО = НайтиПравило(Источник, ИмяПКО);

работает отлично. Теперь появилась потребность изменить источник(связана она с возможностью переноса с группировкой, например, все блюда становятся номенклатурой - "готовое блюдо"). Способ переноса определяется параметрами конвертации, константами, реквизитами объекта.

При написании следующего кода:

Если Параметры.НоменклатураСветнуто Тогда
   ИмяПКО = "Продукты_Свернуто";
   Источник = Перечисления.Питание_ВидыНоменклатуры.Блюдо;
ИначеЕсли Константы.Питание_ДвижениеПоКалькуляции.Получить() Тогда
   ИмяПКО = "Продукты_Детально";
   Источник = Источник.НоменклатураГБ;
Иначе
   ИмяПКО = "Блюда_ПоНаименованию";
КонецЕсли;    
ПКО = НайтиПравило(Источник, ИмяПКО);


возникла следующая ошибка:

Ошибка в обработчике события ПередВыгрузкойОбъекта
   ПКО                    =  Блюда  (Справочник: Блюда)
   Объект                 =  Батон  (Блюдо)
   Обработчик             =  ПередВыгрузкойОбъекта
   ОписаниеОшибки         =  Поле объекта недоступно для записи (Ссылка)
   ПозицияМодуля          =  (6)
   КодСообщения           =  41

Это и понятно, так как входной параметр функции ВыгрузитьПоПравилу передается по ссылке. Добавлением "Знач" перед параметром "Источник" в функцию проблему решил. Но может кто-нибудь знает менее вероломный метод подмена Источника?
1 lxndr
 
27.11.12
12:42
что мешает использовать ВыгрузитьПоПравилу напрямую?
2 NikePopov
 
27.11.12
12:43
Уже пробовал( v8: Работа функции ВыгрузитьПоПравилу ), так и не смог перебороть...
3 Сияющий Асинхраль
 
27.11.12
12:47
Что мешает сделать так:

Если Параметры.НоменклатураСветнуто Тогда
   ИмяПКО = "Продукты_Свернуто";
   Значение = Перечисления.Питание_ВидыНоменклатуры.Блюдо;
ИначеЕсли Константы.Питание_ДвижениеПоКалькуляции.Получить() Тогда
   ИмяПКО = "Продукты_Детально";
   Значение = Источник.НоменклатураГБ;
Иначе
   ИмяПКО = "Блюда_ПоНаименованию";
КонецЕсли;
4 NikePopov
 
27.11.12
12:49
Переменная "Значение" в обработке "ПередВыгрузкойОбъекта" не участвует и конвертироваться в дальнейшем будет именно переменная "Источник".
5 Сияющий Асинхраль
 
27.11.12
12:50
(4) Ты попробуй сначала. Я чаще всего делаю именно приведенным методом, проблем не было ни разу, а работаю с КД достаточно часто...
6 lxndr
 
27.11.12
12:51
(3) +1
(4) приведенный алгоритм сработает для обработчика "Перед выгрузкой" в ПКС, а не для ПКО
7 Йохохо
 
27.11.12
12:55
ВходящиеДанные
8 NikePopov
 
27.11.12
13:02
Не хочется запихивать алгоритм в ПКС, для минимизации возможных ошибок(участвует правило достаточно часто) и схемы с Входящими данными тоже использовать не хочется для очевидности алгоритма.

Всем, кто сразу же скажет что "подмена ПКО" - уже неочевидно отвечаю - в документацию внятно это поместить возможно.

А изменение заголовка функции не столь усложнит жизнь при дальнейшей разработке(описав такой "артефакт" в документации), просто никто же не прочитает такой "ньанс".
9 NikePopov
 
27.11.12
13:04
При создании правил есть требование автономности каждого ПКО. При этом неоптимальности не столь важны.
10 lxndr
 
27.11.12
13:12
По мне так самый логичный способ.
Еще вариант - подменить значение в самом ПКО (Свернуто/детально): брать поля источника, перечисление или чего там еще нужно.
11 NikePopov
 
27.11.12
14:24
Понятно. Спасибо за вашу точку зрения. Думаю вопрос закрыт.