Имя: Пароль:
1C
 
Перенос данных документа через ComObject
,
0 НоваяВолна
 
29.04.21
09:15
Постановка задачи:
1) Перенос самописного документа ПроизводствоЕГАИС из ERP >>> в БП 3.0 типовую (для чего и кем делался этот документ не обсуждается, есть как есть)
2) Из документа ПроизводствоЕГАИС ERP мне нужна только табличная часть и то не вся, только Номенклатура и Количество + Номер и Дата документа (получаю запросом)
3) На основании полученных данных запроса надо сформировать документ "Выпуск продукции"(ОтчетПроизводстваЗаСмену).

Сделал:
1) Внешняя обработка, запуск из БП, получаю запросом необходимые данные из ERP через ComObject
2) Создаю в БП документ "Выпуск продукции", заполняю, провожу.... полет нормальный
3) Ну и проверку на одинаковые документы сделал, чтобы не ругалась программа....

Проблема:
1) В в БП документ "Выпуск продукции" НЕОБХОДИМО  заполнить поля табличной части Спецификация и Материалы
   1.1) Спецификация по сути это Справочники.СпецификацииНменклатуры, а Материалы это табличная часть этого справочника
2) Материалы из п 1.1 НЕПОНЯТНЯ для меня сущность. Потому как кроме списка материалов (номенклатуры) есть ещё Счет, Количество, СтатьяЗатрат

Варианты решения:
    При интерактивном заполнении документа "Выпуск продукции" при выборе Номенклатуры срабатывает событие ПриИзменении, заполняя нужные мне поля Спецификация и Материалы, но делая это через Форму, которую на Сервере я не имею
      А) Попытался копировать процедуры в свою разработку и переписать под себя..... не вышло, слишком гемороно
      B) Решил разобраться как к Материалам привязаны Счет, Количество, СтатьяЗатрат, ведь Спецификацию подтянуть не проблема (у нас она одна на Продукцию).... опять сложности
      C) На форме обработки создал ТЗ с реквизитами, которые получаю в запросе из ERP и хочу заполнить ее запросом с Сервера и потом обратится к ней с Клиента, открыть Форму документа "Выпуск продукции" и имея эту Форму действовать по п. A) вариантов решения.



Вопрос: подскажите как решить данную задачу?
1 НоваяВолна
 
29.04.21
09:29
(0) Особенно прошу подсказать по варианту С) решения. Пока считаю его менее трудозатратным, но боюсь нарваться на "подводные камни.
  Идея состоит в том, чтобы перенести заполненный ТЗ на Клиент, открыть Форму и заполнить, используя стандартные процедуры.
Получится ли?
2 Kassern
 
29.04.21
09:30
(0) "подскажите как решить данную задачу?" - научится пользоваться отладчиком.
".... опять сложности " - хорошо описал, можно было всю задачу написать так, делаю перенос в бух, но у меня лапки...
А по существу, смотри какой код выполняется для заполнения, а дальше, сделай так, чтобы он отрабатывал у тебя на сервере. Небольшой пример из УТ, для наглядности:
При изменении номенклатуры в ТЧ, на клиенте заполняется СтруктураДействий и вызывается:
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
С сервера ты эту процедуру не запустишь, но есть аналог:
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения)
3 Kassern
 
29.04.21
09:30
(2) *научиться
4 Kassern
 
29.04.21
09:31
(1) Вариант С это костыль
5 НоваяВолна
 
29.04.21
09:47
(2) объясни как в твоем примере с Сервера получается ТекущаяСтрока? УТ нет под руками
6 НоваяВолна
 
29.04.21
09:48
(5) а лучше дай текст вызовов
7 Kassern
 
29.04.21
09:55
(5) Очень просто:
    СтруктураДействий = Новый Структура;
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
    
    Док.Товары.Загрузить(ТаблицаЗаказов);
    Для Каждого ТекСтрока Из Док.Товары Цикл
        ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекСтрока, СтруктураДействий, Неопределено);
    КонецЦикла;
8 программистище
 
29.04.21
09:56
(5) а что не так с текущей строкой на сервере?
текстрока это или текущие данные в контексте изменяемого поля табформы
или строкаТЧ в цикле
9 Kassern
 
29.04.21
10:02
(7) Можно было бы и еще красивее через ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(ТЧ, СтруктураДействий, КэшированныеЗначения), но было бы не так наглядно.
10 НоваяВолна
 
29.04.21
10:08
(8) в том смысле, что стандартный механизм БП хочет получить строку с Формы, и КлючСтроки с Формы. Я же получаю данные на Сервер и не имею формы
11 Kassern
 
29.04.21
10:11
(10) вы серверные модули для обработки строк смотрели?
12 Kassern
 
29.04.21
10:17
(10) буквально 2 мин времени в конфе и все находится...
СведенияОНоменклатуре = БухгалтерскийУчетПереопределяемый.ПолучитьСведенияОНоменклатуре(
        СтрокаТабличнойЧасти.Номенклатура, ДанныеОбъекта);
    Если СведенияОНоменклатуре = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    СтрокаТабличнойЧасти.ЕдиницаИзмерения        = СведенияОНоменклатуре.ЕдиницаИзмерения;
    СтрокаТабличнойЧасти.Коэффициент            = СведенияОНоменклатуре.Коэффициент;
    
    СтрокаТабличнойЧасти.СтатьяЗатрат            = ?(ЗначениеЗаполнено(СведенияОНоменклатуре.СтатьяЗатрат),
        СведенияОНоменклатуре.СтатьяЗатрат,    ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.СтатьиЗатрат.СписаниеМатериалов"));
    СтрокаТабличнойЧасти.НоменклатурнаяГруппа    = СведенияОНоменклатуре.НоменклатурнаяГруппа;
    СтрокаТабличнойЧасти.СпособУчетаНДС            = СведенияОНоменклатуре.СпособУчетаНДС;    
    СтрокаТабличнойЧасти.ОтражениеВУСН    = Перечисления.ОтражениеВУСН.Принимаются;
    
    Документы.ОтчетПроизводстваЗаСмену.ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти(
        ДанныеОбъекта, СтрокаТабличнойЧасти, "Материалы", СведенияОНоменклатуре);
13 Kassern
 
29.04.21
10:18
(12) И да модуль БухгалтерскийУчетПереопределяемый  работает на сервере
14 Kassern
 
29.04.21
10:19
(10) покажите мне, где стандартный механизм в вашем вопросе требует "строку с Формы, и КлючСтроки с Формы"
15 НоваяВолна
 
29.04.21
10:24
(14)

&НаКлиенте
Процедура ПродукцияНоменклатураПриИзменении(Элемент)
    
    ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
    
    ДанныеСтрокиТаблицы = Новый Структура(
        "Номенклатура, ЕдиницаИзмерения, Коэффициент, Количество,
        |ПлановаяСтоимость, СуммаПлановая,
        |Спецификация, Счет, НоменклатурнаяГруппа");
        
    ЗаполнитьЗначенияСвойств(ДанныеСтрокиТаблицы, ТекущиеДанные);
    
    ДанныеОбъекта = Новый Структура("Дата, Организация, Склад");
    ЗаполнитьЗначенияСвойств(ДанныеОбъекта, Объект);
    
    ПараметрыЗаполненияСчетовУчета = ОтчетПроизводстваЗаСменуФормыКлиентСервер.НачатьЗаполнениеСчетовУчета(
        "Продукция.Номенклатура",
        Объект,
        ТекущиеДанные,
        ДанныеОбъекта,
        ДанныеСтрокиТаблицы);
    
    ПродукцияНоменклатураПриИзмененииНаСервере(ДанныеСтрокиТаблицы, ДанныеОбъекта, ПараметрыЗаполненияСчетовУчета.КЗаполнению);
    
    ЗаполнитьЗначенияСвойств(ТекущиеДанные, ДанныеСтрокиТаблицы);
    
    ЗаполнитьМатериалыДляПродукцииНаСервере(ТекущиеДанные.КлючСтроки, ДанныеОбъекта);
    
КонецПроцедуры
16 НоваяВолна
 
29.04.21
10:26
(15) + последняя строка
ЗаполнитьМатериалыДляПродукцииНаСервере(ТекущиеДанные.КлючСтроки, ДанныеОбъекта);
17 Kassern
 
29.04.21
10:30
(15) ну а вы переходили по этой строчке дальше?
18 Kassern
 
29.04.21
10:31
(17) Если бы переходили, то увидели бы мой код из (12) и вопросов бы у вас не было. По факту это обычная строка табличной части
19 НоваяВолна
 
29.04.21
10:38
(17) переходил и не только.... там под конец вылетает ошибка в ОбщемМодуле потому как хочет КоллекциюФормы, а я ему тупо строку передаю
20 Kassern
 
29.04.21
10:40
(19) на каком куске кода вылетает и что передаете?
21 osa1C
 
29.04.21
11:29
(16) +++

&НаСервере
Процедура ЗаполнитьМатериалыДляПродукцииНаСервере(КлючСтроки, Знач ДанныеОбъекта)
    
    УдалитьСвязанныеМатериалы(КлючСтроки);
    
    ОтборПродукции = Новый Структура();
    ОтборПродукции.Вставить("КлючСтроки", КлючСтроки);
    СтрокаПродукции = Объект.Продукция.НайтиСтроки(ОтборПродукции);
    СписокМатериаловПоСпецификации = СписокМатериаловПоСпецификацииПродукции(Объект.Продукция.Выгрузить(СтрокаПродукции));
    
    Если ЗначениеЗаполнено(СписокМатериаловПоСпецификации) Тогда
        
        СтрокиМатериалы = Новый Массив();
        
        Для Каждого СтрокаМатериаловПоСпецификации Из СписокМатериаловПоСпецификации Цикл
            СтрокаМатериалов = Объект.Материалы.Добавить();
            ЗаполнитьЗначенияСвойств(СтрокаМатериалов, СтрокаМатериаловПоСпецификации);
            СтрокаМатериалов.КлючСтроки = КлючСтроки;
            СтрокиМатериалы.Добавить(СтрокаМатериалов);
        КонецЦикла;
        
        СчетаУчетаВДокументах.ЗаполнитьСтроки(СтрокиМатериалы, "Материалы", ДанныеОбъекта, Документы.ОтчетПроизводстваЗаСмену);
        
    КонецЕсли;
    
    СтрокаПродукции[0].СписокМатериалов             = СписокМатериаловПродукции(КлючСтроки, СоответствиеМатериалы());
    СтрокаПродукции[0].РучнаяКорректировкаМатериалов = Ложь;
    
КонецПроцедуры
22 НоваяВолна
 
29.04.21
11:33
(21) ну да.... так и есть. Но именно тут идет ОтборСпискаМатериалов через КлючСтроки. В этом у меня и затык
23 НоваяВолна
 
29.04.21
13:24
up
24 Kassern
 
29.04.21
13:27
(23) а что ап то? Там реквизитов в ТЧ раз два и кончились, посомтри как они заполняются в БухгалтерскийУчетПереопределяемый.ПолучитьСведенияОНоменклатуре()  и заполняй у себя
25 НоваяВолна
 
06.05.21
10:28
(24) вот и все что мне хватило!!!...
СтрТаб.КлючСтроки = Новый УникальныйИдентификатор
26 НоваяВолна
 
06.05.21
10:31
(25) тупо нет ключа строки у нового. И стандартные процедуры обращаются к ключу строки. Раскопал это и все!!