PDA

Просмотр полной версии : Движения по регистрам в программно созданном документе (8.2 КА 1.1)



Quiliansky
07.08.2016, 01:49
Доброй ночи уважаемые форумчане!
Толкнулся с проблемой проведения программно созданного документа - Выпуск требование. При проведении не пишет в регистры почему то.
Всю голову сломал, не знаю что делать.
Если писать все движения вручную -


ВыпускПродукции.Движения.Т оварыНаСкладах.Добавить
и т.д.

то все работает. С регистрами по остаткам я еще справлюсь, но с бухгалтерскими очень туго придется. Да и не к чему это. ведь есть стандартный обработчик проведения в документе... НО ПОЧЕМУ ТО ОН НЕ ФУНЦИКЛИРУЕТ как бы мне хотелось...
Уверен, что что-то делаю не так. Но не пойму что, так как эта обработка - первое, что я сделал в 1С, поэтому спрячьте пожалуйста помидоры и тухлые яйца, я учусь только...

Вот что я соорудил:



// Создание и Заполнение данными документа ВЫПУСК ПРОДУКЦИИ;

ОкончаниеПериода = КонецДня(КонецПериода);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстаткиИОб ороты.Склад.Наименование КАК Склад,
| ТоварыНаСкладахОстаткиИОб ороты.КоличествоКонечныйО� �таток,
| ТоварыНаСкладахОстаткиИОб ороты.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстаткиИОб ороты.Номенклатура.Единица ХраненияОстатков КАК ЕдИзм
|ИЗ
| РегистрНакопления.ТоварыН� �Складах.ОстаткиИОбороты(&НачалоПериода, &ОкончаниеПериода, , , ) КАК ТоварыНаСкладахОстаткиИОб ороты
|ГДЕ
| ТоварыНаСкладахОстаткиИОб ороты.КоличествоКонечныйО� �таток < 0
| И ТоварыНаСкладахОстаткиИОб ороты.Номенклатура.ВидНоме нклатуры.Код В (""000000003"", ""000000004"")
| И ТоварыНаСкладахОстаткиИОб ороты.Склад.Код = ""000000051""
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода",НачалоПериода);
Запрос.УстановитьПараметр("ОкончаниеПериода",ОкончаниеПериода);

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();

НовыйВыпускГМЦ = Документы.ВыпускПродукции. СоздатьДокумент();
НовыйВыпускГМЦ.Склад = Справочники.Склады.НайтиПо Коду("000000051");
НовыйВыпускГМЦ.Организаци� � = Справочники.Организации.На йтиПоКоду("000000005");
НовыйВыпускГМЦ.Подразделе� �ие = Справочники.Подразделения. НайтиПоКоду("000000033");
НовыйВыпускГМЦ.Подразделе� �иеОрганизации = Справочники.Подразделения� �рганизаций.НайтиПоКоду("000000025");
НовыйВыпускГМЦ.Комментари� � = "Выпуск продукции за период "+НачалоПериода+" по "+ОкончаниеПериода;

Пока Выборка.Следующий () Цикл
НоваяСтрокаТЧ = НовыйВыпускГМЦ.Продукция.Д обавить();
НоваяСтрокаТЧ.Номенклатур� � = Выборка.Номенклатура;
НоваяСтрокаТЧ.ЕдиницаИзме� �ения = Выборка.ЕдИзм;
НоваяСтрокаТЧ.Количество = -Выборка.КоличествоКонечны� �Остаток;
НоваяСтрокаТЧ.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.В ыпускПродукции;
НоваяСтрокаТЧ.Качество = Справочники.Качество.Найти ПоНаименованию("Новый");
КонецЦикла;
Иначе
Возврат
КонецЕсли;

НовыйВыпускГМЦ.ПолучитьФо� �му("ФормаДокумента").Открыть();
НовыйВыпускГМЦ.ОтражатьВУ� �равленческомУчете = Истина;
НовыйВыпускГМЦ.ОтражатьВБ� �хгалтерскомУчете = Истина;
НовыйВыпускГМЦ.Продукция.С ортировать("Номенклатура Возр");
НовыйВыпускГМЦ.Дата = ОкончаниеПериода - 3519;
НовыйВыпускГМЦ.СчетЗатрат = ПланыСчетов.Хозрасчетный.Н айтиПоКоду("20.01.2");




Пробовал добавить:


НовыйВыпускГМЦ.Движения.То варыНаСкладах (не только этот регистр. но и се остальные, куда должен писать этот документ).Записывать = Истина;

ТОлку не прибавило.
Надеюсь на Вашу помощь. Спасибо!

Quiliansky
07.08.2016, 01:54
Время ночное, прошу прощения за очепятки:
Столкнулся с проблемой..
Документ не Выпуск требование - а ВыпускПродукции

Quiliansky
07.08.2016, 02:02
Да и небольшое пояснение. В Цехе выпускают полуфабрикаты и реализуют их на Отдел, Т.е создается документ РеализацияТоваровУслуг из Цеха в Отдел. Но так как выпуск продукции не осуществлен остаток по Цеху получается отрицательный и в количестве отрицательного остатка, переведенного в положительный, я выпускаю продукцию, чтобы убрать красноту.
Схема мудреная, но так делали у нас всегда. Сейчас все делается в ручную, страсть как надоело, поэтому пытаюсь автоматизировать процесс.
Застрял на финише....

alexandr_ll
07.08.2016, 10:43
Так программно созданный документ есть в журнале?
Интерактивно он проводится?
Как выглядит команда НовыйВыпуск.Записать() в приведенном куске кода?

Quiliansky
07.08.2016, 13:56
Боюсь неправильно могу понять, то что Вы спрашиваете, извиняюсь заранее.
Этот документ при записи я могу найти в журнале, т.е. он там появляется. Более того там пиктограмма слева, что он проведен (табличка с галочкой).
Когда нажимаешь провести, то он меняет статус с Новый*, на Проведен.
Нажимаю Перейти - Движения по регистрам и вижу, что он пишет в регистры "ТоварыНаСкладах" и "ТоварыОрганизации" только наименования номенклатуры из документов, количество не пишет - пусто.
Если я пишу вручную Регистр.ТоварыНаСкладах.До бавить.Количество для цикла перебора табличной части и беру это количество из запроса. То количество добавляется.
НО... помимо этих двух регистров, документ должен писать в регистры бухгалтерии "Журнал проводок" и "Учет затрат". Там вручную я не справлюсь, так как совсем не бухгалтер.

По поводу команды записать:


НовыйВыпускГМЦ.Записать(Ре жимЗаписиДокумента.Провед� �ние);

Но по прежнему ничего не работает. И то я его с интернета взял, не особо понимаю его смысла, так как теперь при нажатии кнопки "Записать" он его проводит.... :confused:
И это не кусок кода, а весь:)

Попробовал точкой останова поймать обработчик проведения, но там очень все запутано, я замучился F11 нажимать и так и до конца не дошел.
Думаете лентяй - нет, просто мозг закипает уже!:eek:

alexandr_ll
08.08.2016, 08:25
Почему документ должен проводиться "так. как бы вам хотелось"?
Как проводятся документы ранее введенные без вашей обработки?
Если нормально, то сравните документы между собой (типа "найди 10 отличий")

Quiliansky
08.08.2016, 11:24
Если создаешь документ просто и проводишь, то все проводится без проблем.
Все сверил, все одинаково, все реквизиты проставил как в обычном документе. Не пойму в чем причина?
Грешил на количество из запроса, из него выгружается количество с отрицательным значением, а в документ я записываю те же значения, только с плюсом

НоваяСтрокаТЧ.Количество = -Выборка.КоличествоКонечны� �Остаток;

Может быть из за этого?

alexandr_ll
08.08.2016, 17:00
Если документы одинаковые, то и проводиться они должны одинаково. Значит есть различия, ищите.

Quiliansky
11.08.2016, 01:15
Со своими скудными знаниями в области 1с немного приблизился к решению проблемы.
Проблема может быть в вызове события. Т.е. при создании документа ВыпускПродукции событие "ПриОткрытии" срабатывает. (Поймали точкой)
Но когда дело доходит до табличной части возникает "болезнь пятой точки":
При добавлении строки табличной части вручную, первое что нужно заполнить - это номенклатура. Когда её заполняешь (Там поле ввода, которое вызывает "ФормуВыбора" справочника "Номенклатура", т.е по сути надо значение "выбрать"), то все остальные строчки заполняются сами.

Посмотрели, что на это влияет процедура в модуле формы Самого документа - "ПродукцияПриИзмененииНоме нклатуры" (Эта Процедура находится в свойствах поля ввода таблично части, колонка Номенклатура)

Пробовал заполнять Номенклатуру через элемент формы:

ФормаВыпуск.Открыть();
ФормаВыпуск.ЭлементыФормы. Продукция.ДобавитьСтроку();
СтрокаТабличнойЧасти = ФормаВыпуск.ЭлементыФормы. Продукция.ТекущиеДанные;
СтрокаТабличнойЧасти.Номе� �клатура = Выборка.Номенклатура;

Не цепляется это событие.

Я делаю Вывод, что программно надо сделать так:
1. Встать на поле "номенклатура" табличной части, только что созданной новый строки;
2. В поле ввода нажать на кнопочку с тремя точками;
3. Выбрать в форме выбора справочника "Номенклатура" нужную номенклатуру;
И все случиться.
Я все это понимаю, но как программно выполнить не соображу. Прошу Вашей помощи!

Или второй вариант. Каким то образом вызвать Событие "ПродукцияПриИзмененииНоме нклатуры".
Единственный вариант который придумал скудный мозг - это "ПолучитьДействие", но к табличной части я его не смог прикрутить.

Вообщем очень надеюсь на Вашу помощь!

alexandr_ll
11.08.2016, 08:35
Со своими скудными знаниями в области 1с немного приблизился к решению проблемы.
Проблема может быть в вызове события. Т.е. при создании документа ВыпускПродукции событие "ПриОткрытии" срабатывает. (Поймали точкой)
Но когда дело доходит до табличной части возникает "болезнь пятой точки":
При добавлении строки табличной части вручную, первое что нужно заполнить - это номенклатура. Когда её заполняешь (Там поле ввода, которое вызывает "ФормуВыбора" справочника "Номенклатура", т.е по сути надо значение "выбрать"), то все остальные строчки заполняются сами.

Посмотрели, что на это влияет процедура в модуле формы Самого документа - "ПродукцияПриИзмененииНоме нклатуры" (Эта Процедура находится в свойствах поля ввода таблично части, колонка Номенклатура)

Пробовал заполнять Номенклатуру через элемент формы:

ФормаВыпуск.Открыть();
ФормаВыпуск.ЭлементыФормы. Продукция.ДобавитьСтроку();
СтрокаТабличнойЧасти = ФормаВыпуск.ЭлементыФормы. Продукция.ТекущиеДанные;
СтрокаТабличнойЧасти.Номе� �клатура = Выборка.Номенклатура;

Не цепляется это событие.

Я делаю Вывод, что программно надо сделать так:
1. Встать на поле "номенклатура" табличной части, только что созданной новый строки;
2. В поле ввода нажать на кнопочку с тремя точками;
3. Выбрать в форме выбора справочника "Номенклатура" нужную номенклатуру;
И все случиться.
Я все это понимаю, но как программно выполнить не соображу. Прошу Вашей помощи!

Или второй вариант. Каким то образом вызвать Событие "ПродукцияПриИзмененииНоме нклатуры".
Единственный вариант который придумал скудный мозг - это "ПолучитьДействие", но к табличной части я его не смог прикрутить.

Вообщем очень надеюсь на Вашу помощь!

Ну и пропишите в своей обработке все действия, которые выполняет процедура "ПродукцияПриИзмененииНоме нклатуры", все нужные пол и заполнятся

alexandr_ll
11.08.2016, 08:36
Со своими скудными знаниями в области 1с немного приблизился к решению проблемы.
Проблема может быть в вызове события. Т.е. при создании документа ВыпускПродукции событие "ПриОткрытии" срабатывает. (Поймали точкой)
Но когда дело доходит до табличной части возникает "болезнь пятой точки":
При добавлении строки табличной части вручную, первое что нужно заполнить - это номенклатура. Когда её заполняешь (Там поле ввода, которое вызывает "ФормуВыбора" справочника "Номенклатура", т.е по сути надо значение "выбрать"), то все остальные строчки заполняются сами.

Посмотрели, что на это влияет процедура в модуле формы Самого документа - "ПродукцияПриИзмененииНоме нклатуры" (Эта Процедура находится в свойствах поля ввода таблично части, колонка Номенклатура)

Пробовал заполнять Номенклатуру через элемент формы:

ФормаВыпуск.Открыть();
ФормаВыпуск.ЭлементыФормы. Продукция.ДобавитьСтроку();
СтрокаТабличнойЧасти = ФормаВыпуск.ЭлементыФормы. Продукция.ТекущиеДанные;
СтрокаТабличнойЧасти.Номе� �клатура = Выборка.Номенклатура;

Не цепляется это событие.

Я делаю Вывод, что программно надо сделать так:
1. Встать на поле "номенклатура" табличной части, только что созданной новый строки;
2. В поле ввода нажать на кнопочку с тремя точками;
3. Выбрать в форме выбора справочника "Номенклатура" нужную номенклатуру;
И все случиться.
Я все это понимаю, но как программно выполнить не соображу. Прошу Вашей помощи!

Или второй вариант. Каким то образом вызвать Событие "ПродукцияПриИзмененииНоме нклатуры".
Единственный вариант который придумал скудный мозг - это "ПолучитьДействие", но к табличной части я его не смог прикрутить.

Вообщем очень надеюсь на Вашу помощь!

Ну и пропишите в своей обработке все действия, которые выполняет процедура "ПродукцияПриИзмененииНоме нклатуры", все нужные пол и заполнятся

Quiliansky
11.08.2016, 21:25
Спасибо, все получилось. Поля заполняет, но опять уперся в проблему. Не заполняются счета учета БУ в строках табличной части. Не дает провести.

Я вот что подумал, сейчас мы лезем все глубже и глубже в дебри 1Совских разработок. Может этого и не стоит делать?

Может Вы подскажите как программно выбрать изменить реквизит формы так, чтобы вызвать обработчик "ПриИзменении".

Просто если делать допустим:

ФормаДокумента.Организаци� � = Справочник.Организации.Най тиПоНаименованию ("Ромашка");

или

Документы.ВыпускПродукции. СоздатьДокумент().Организа� �ия = Справочник.Организации.Най тиПоНаименованию ("Ромашка");

Значение то в форму встанет, но обработчик не вызывается. Потому что (на мой взгляд) Программа понимает это как присвоение, а не изменение.

Так как же изменить значение в строке?

Quiliansky
14.08.2016, 02:51
Вот такая конструкция позволила провалиться в стандартный обработчик "ПриИзменении"




ФормаВыбораСправочникаОрг = Справочники.Организации.По лучитьФормуВыбора("ФормаВыбора",ФормаВыпуска.ЭлементыФорм ы.Организация);
ФормаВыбораСправочникаОрг .ЭлементыФормы.СправочникС писок.ИерархическийПросмо� �р = Ложь;
ОткрытьФорму(ФормаВыбораС� �равочникаОрг,,ФормаВыпуск� �.ЭлементыФормы.Организаци� �);

Если ФормаВыбораСправочникаОрг .Открыта() Тогда
ФормаВыбораСправочникаОрг .Активизировать();
КонецЕсли;

ФормаВыбораСправочникаОрг .ТекущийЭлемент.ТекущаяСтр ока = Справочники.Организации.На йтиПоКоду("000000005");
ВыборЭлемента = ФормаВыбораСправочникаОрг .ТекущийЭлемент.ТекущаяСтр ока;

ФормаВыбораСправочникаОрг .ОповеститьОВыборе(ВыборЭл емента);



Всем спасибо!