Не записываются программно созданные документы

1. strafer 23.01.18 17:19 Сейчас в теме
Доброго времени суток, подскажите ответ на такой казалось бы простой вопрос. Не записываются программно созданные документы.
Документ "Поступление товаров и услуг", при проведении получаю ошибку "...розничная цена не равна учетной...сделайте переоценку". Решил сделать чтобы автоматически добавлялись соответствующие строки в документ "Переоценка товаров в рознице". В модуль документа "Поступления.." в процедуру ОбработкаПроведения, после формирования ТаблицыПоТоварам(с дополнительными колонками "УчетнаяЦена" и "РозничнаяЦена") добавил код
	Для Каждого СтрокаТаблицы Из ТаблицаПоТоварам Цикл
		ДопустимоеОтклонение = СтрокаТаблицы.УчетнаяЦена * 0,1;
		Если СтрокаТаблицы.РозничнаяЦена = 0 Тогда
			//Сделать установку цен номенклатуры автоматически
                       Продолжить;
		ИначеЕсли СтрокаТаблицы.УчетнаяЦена = 0 Тогда
			Продолжить;
		ИначеЕсли СтрокаТаблицы.РозничнаяЦена - СтрокаТаблицы.УчетнаяЦена > ДопустимоеОтклонение
			ИЛИ СтрокаТаблицы.РозничнаяЦена - СтрокаТаблицы.УчетнаяЦена < - ДопустимоеОтклонение Тогда
			//Переоценку товаров в рознице автоматически
			ВыборкаДокументПереоценки = Документы.ПереоценкаТоваровВРознице.Выбрать(НачалоДня(Дата),КонецДня(Дата)+1,,"Дата Убыв");
			Если ВыборкаДокументПереоценки.Следующий() Тогда 
				ДокументПереоценки = ВыборкаДокументПереоценки.ПолучитьОбъект();
			Иначе
				ДокументПереоценки = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
				ЗаполнениеДокументов.ЗаполнитьОбязательныеРеквизитыШапкиНовогоДокумента(ДокументПереоценки, глЗначениеПеременной("глТекущийПользователь"));
				ДокументПереоценки.Дата = НачалоДня(Дата);
				ДокументПереоценки.Склад = Справочники.Склады.НайтиПоКоду("000000002");//Розничный склад
				ДокументПереоценки.Организация = глЗначениеПеременной("ОсновнаяОрганизация");
				ДокументПереоценки.Записать(РежимЗаписиДокумента.Запись);
			КонецЕсли;	
			СтрокаТЧ = ДокументПереоценки.Товары.Добавить();
			СтрокаТЧ.Номенклатура = СтрокаТаблицы.Номенклатура;
			СтрокаТЧ.Количество = СтрокаТаблицы.Количество;
			СтрокаТЧ.ЦенаВРознице = СтрокаТаблицы.РозничнаяЦена;
			СтрокаТЧ.ЦенаВРозницеСтарая = Макс(СтрокаТаблицы.УчетнаяЦена, -СтрокаТаблицы.УчетнаяЦена);
			СтрокаТЧ.СтавкаНДСВРознице = СтрокаТаблицы.СтавкаНДС;
			СтрокаТЧ.СуммаПереоценки = (СтрокаТЧ.ЦенаВРознице-СтрокаТЧ.ЦенаВРозницеСтарая)*СтрокаТЧ.Количество;
			ДокументПереоценки.Комментарий = "Изменено при проведении поступления товаров: "+Заголовок;
			ДокументПереоценки.Ответственный = глЗначениеПеременной("глТекущийПользователь");
			ДокументПереоценки.ЗаполнитьНалоговыеРеквизитыВТабЧастиТовары(Истина);
			ДокументПереоценки.Записать(РежимЗаписиДокумента.Проведение);
		КонецЕсли;
	КонецЦикла;
Показать

Смотрел отладчиком, документ создаётся и заполняется, но не записывается. В случае если уже есть документ, то дописывает в существующий. И да документ дополняется по одной строке. Если строк много, то проводится дольше, но оптимизация это второй шаг. Сама суть что наполняется документ "Переоценка товаров в рознице" нужными строками, но когда выходит из цикла и продолжается проведение, то документа "Переоценка..." нет в базе(или если там был уже созданный, то изменений в нём нет). Пытался вынести в отдельную процедура в Общих модулях и передавать туда на обработку ТаблицуПоТоварам, один раз на этапе теста сработало и документ создало. На этом все. Написал простую внешнюю обработку которая создаёт пустые документы "Переоценка" на заданную дату. Думал прав у пользователя нет или период закрыт. Но пустышки создаются на ура. Конфигурация "Бухгалтерия для Украины" 1.2.44.2, толстый клиент. Платформы пробовал 8.3.9 и 8.3.11.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Fox-trot 158 23.01.18 17:39 Сейчас в теме
закоментируй
 Если ВыборкаДокументПереоценки.Следующий() Тогда 
                ДокументПереоценки = ВыборкаДокументПереоценки.ПолучитьОбъект();
            Иначе

строки вынеси в начало программы, то есть из цикла
ДокументПереоценки = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
                ЗаполнениеДокументов.ЗаполнитьОбязательныеРеквизитыШапкиНовогоДокумента(ДокументПереоценки, глЗначениеПеременной("глТекущийПользователь"));
                ДокументПереоценки.Дата = НачалоДня(Дата);
                ДокументПереоценки.Склад = Справочники.Склады.НайтиПоКоду("000000002");//Розничный склад
                ДокументПереоценки.Организация = глЗначениеПеременной("ОсновнаяОрганизация");

строку опусти в самый низ, то есть вынеси из цикла
ДокументПереоценки.Записать(РежимЗаписиДокумента.Запись);

а перед записью не плохо бы проверить
ДокументПереоценки.Товары.Количество() > 0
3. VZyryanov 23.01.18 17:40 Сейчас в теме
Возможно из-за того, что событие ОбработкаПроведение выполняется в транзакции.
Попробуйте перенесите код в событие ПередЗаписью.
4. strafer 24.01.18 13:30 Сейчас в теме
(3) Перенёс в ПередЗаписью, но все так же. Спасибо кстати за информацию, как то даже забыл что процедура идёт в транзакции. Это полезное замечание.

(2) Сделал вот так
ВыборкаДокументПереоценки = Документы.ПереоценкаТоваровВРознице.Выбрать(НачалоДня(Дата),КонецДня(Дата)+1,,"Дата Убыв");
		Если ВыборкаДокументПереоценки.Следующий() Тогда 
			ДокументПереоценки = ВыборкаДокументПереоценки.ПолучитьОбъект();
		Иначе
			ДокументПереоценки = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
			ЗаполнениеДокументов.ЗаполнитьОбязательныеРеквизитыШапкиНовогоДокумента(ДокументПереоценки, глЗначениеПеременной("глТекущийПользователь"));
			ДокументПереоценки.Дата = НачалоДня(Дата);
			ДокументПереоценки.Склад = Справочники.Склады.НайтиПоКоду("000000002");
			ДокументПереоценки.Организация = глЗначениеПеременной("ОсновнаяОрганизация");
		КонецЕсли;
		Для Каждого СтрокаТаблицы Из ТаблицаПоТоварам Цикл
			ДопустимоеОтклонение = СтрокаТаблицы.УчетнаяЦена * 0,1;
			Если СтрокаТаблицы.РозничнаяЦена = 0 Тогда
				//Сделать установку цен номенклатуры автоматически
                                Продолжить;
			ИначеЕсли СтрокаТаблицы.УчетнаяЦена = 0 Тогда
				Продолжить;
			ИначеЕсли СтрокаТаблицы.РозничнаяЦена - СтрокаТаблицы.УчетнаяЦена > ДопустимоеОтклонение
				ИЛИ СтрокаТаблицы.РозничнаяЦена - СтрокаТаблицы.УчетнаяЦена < - ДопустимоеОтклонение Тогда
				СтрокаТЧ = ДокументПереоценки.Товары.Добавить();
				СтрокаТЧ.Номенклатура = СтрокаТаблицы.Номенклатура;
				СтрокаТЧ.Количество = СтрокаТаблицы.Количество;
				СтрокаТЧ.ЦенаВРознице = СтрокаТаблицы.РозничнаяЦена;
				СтрокаТЧ.ЦенаВРозницеСтарая = Макс(СтрокаТаблицы.УчетнаяЦена, -СтрокаТаблицы.УчетнаяЦена);
				СтрокаТЧ.СтавкаНДСВРознице = СтрокаТаблицы.СтавкаНДС;
				СтрокаТЧ.СуммаПереоценки = (СтрокаТЧ.ЦенаВРознице-СтрокаТЧ.ЦенаВРозницеСтарая)*СтрокаТЧ.Количество;
			КонецЕсли;
		КонецЦикла;
		ДокументПереоценки.ЗаполнитьНалоговыеРеквизитыВТабЧастиТовары(Истина);
		ДокументПереоценки.Записать(РежимЗаписиДокумента.Проведение);
Показать

Ситуация так же.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот