|
Перенос данных документа через 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) тупо нет ключа строки у нового. И стандартные процедуры обращаются к ключу строки. Раскопал это и все!!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |