Помогите с обработкой бух

Версия для печатиPDF-версия
Попросили создать внешнюю обработку
 
Выбираем остатки по счету 43 (41) по складу из шапки и смотрим номенклатуру в разрезе партий по которой сумма не равно нулю а количество равно нулю и по этим позициям делаем проводки:
Техзадание на обработку

Операция вручную на конец месяца.

как я поняла возникает ошибка что в счетах есть сумма но нет количества и необходимо вывести эти товары. при том пользователь вводит любую дату а выводится именно на конец месяца.

но само задание я не могу понять как делать.

Добавьте картинку как описано тут.
Добавила изображение.
Вам нужно запросом найти остатки по счёту 41.11 на определённую дату в разрезе номенклатуры, партий и складов, имеющие нулевое количество и ненулевую сумму, и создать документ Ручная операция, сторнирующий эту сумму. Я правильно понимаю? В чём сложность?
в том что я занимаюсь программированием всего неделю а на работе попросили сделать это. я не могу понять что должно быть в тексте запроса.
Примерно такой запрос:
ВЫБРАТЬ
	ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
	ХозрасчетныйОстатки.Субконто2 КАК Партия,
	ХозрасчетныйОстатки.Субконто3 КАК Склад,
	ХозрасчетныйОстатки.СуммаОстаток,
	ХозрасчетныйОстатки.КоличествоОстаток
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
ГДЕ
	ХозрасчетныйОстатки.СуммаОстаток > 0
	И ХозрасчетныйОстатки.КоличествоОстаток = 0
А счета в массив добавить?
Если нужен запрос по нескольким счетам, то условие "Счет = &Счет" нужно заменить на "Счет В (&Счет)" и в параметр Счет передавать массив счетов.
{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(8, 56)}: Не задано значение параметра "Счет"
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = <<?>>&Счет, , ) КАК ХозрасчетныйОстатки
 
 
Эта ошибка уже обсуждалась здесь.
Нужно создать реквизит формы (добавить на форму поле ввода) с типом значения ПланСчетовСсылка.Хозрасчетный или объявить переменную и присвоить ей значение нужного счёта.
Далее после объявления Запроса установить параметр:
Запрос.УстановитьПараметр("Счет", Счет);
я создала массив в который добавила 41.01 счёт и 43 счёт.  и установила этот параметр.
 
 
Вот весь текст обработки:
 
КонПериода = КонецМесяца(Дата);  
 
Счет = Новый Массив; 
//    41.01
Счет.добавить(планысчетов.хозрасчетный.ТоварыНаСкладах);
//    43
Счет.добавить(планысчетов.Хозрасчетный.ГотоваяПродукция);
 
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто2 КАК Партия,
| СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК Сумма,
| СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Количество
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&КонПериода, Счет В ИЕРАРХИИ (&Счет), , Субконто3 = &Склад) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.СуммаОстаток <> 0
| И ХозрасчетныйОстатки.КоличествоОстаток = 0
|
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.Субконто2";
 
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("Счет", Счет);
Запрос.УстановитьПараметр("Склад", Склад);
 
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Табличка.Загрузить(РезультатЗапроса);
 
 
Теперь как мне сделать проводку(она будет в другой процедуре)?
Я уже отвечал вам выше: в запросе условие "Счет = &Счет" нужно заменить на "Счет В (&Счет)".
И если хотите получать остатки сразу по нескольким счетам, то в отбираемые поля нужно добавить Счет (для формирования проводок пригодится).
Сделала не много по другому. посмотрите выше
Во-первых, нет смысла ставить сравнение "В ИЕРАРХИИ", достаточно просто "В". Ведь вам нужно получить остатки только по определённым счетам без учёта субсчетов.
Во-вторых, группировка в запросе также не имеет смысла, т.к. итак будут получены итоговые суммовые и количественные остатки в разрезе номенклатуры и партий.
В-третьих, нужно добавить в выбранные поля Счет, чтобы иметь информацию по какому счёту делать проводку.
Для создания проводок:
1. Создаёте новый документ ОперацияБух, заполняете его реквизиты (Дата, Организация, Ответственный, Содержание проводки, Комментарий и пр.) и записываете документ.

	НовДок = Документы.ОперацияБух.СоздатьДокумент();
	НовДок.Организация = Организация;
	...
	НовДок.Записать();
2. Создаёте набор записей регистра бухгалтерии Хозрасчетный. Устанавливаете отбор по регистратору. 


	Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
	Проводки.Отбор.Регистратор.Установить(НовДок.Ссылка);
3. В цикле обходите выборку из результата запроса, создаёте проводки и заполняете их.


	Пока Выборка.Следующий() Цикл 
		Проводка = Проводки.Добавить();
		Проводка.СчетДт = Выборка.Счет;
		Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ТорговаяНаценкаАТТ;
		Проводка.Сумма = - Выборка.СуммаОстаток;
		Проводка.КоличествоДт = 0;
		Проводка.КоличествоКт = 0;
		Проводка.СубконтоДт["Номенклатура"] = Выборка.Номенклатура;
		Проводка.СубконтоДт["Партия"] = Выборка.Партия;
		Проводка.СубконтоДт["Склад"] = Склад;
		Проводка.СубконтоКт["Номенклатура"] = Выборка.Номенклатура;
		Проводка.СубконтоКт["Партия"] = Выборка.Партия;
		Проводка.СубконтоКт["Склад"] = Склад;
		...
		// Заполнение прочих реквизитов
		...
	КонецЦикла;

4. Записываете набор записей.


	Проводки.Записать();
 
а если цикл сделать не "пока" а "для каждого"
 
Вот текст процедуры:
 
Процедура КнопкаВыполнитьНажатие(Кнопка)
текУчреждение = справочники.Организации.НайтиПоКоду("000000001");
 
 
НовДок = Документы.ОперацияБух.СоздатьДокумент();
НовДок.Дата = Дата;
НовДок.Организация = справочники.Организации.НайтиПоКоду("000000001");
НовДок.Комментарий = "Автоматическая обработка выбора остатков по счёту 41.01 и 43";
НовДок.Записать();
 
Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Проводки.Отбор.Регистратор.Установить(НовДок.Ссылка);
 
Для каждого строка из табличка Цикл 
Проводка = Проводки.Добавить();
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыВРозничнойТорговлеВПродажныхЦенахАТТ;
Проводка.СчетКт = строка.Счет;
Проводка.Сумма = строка.Сумма;
Проводка.КоличествоДт = 0;
Проводка.КоличествоКт = 0;
Проводка.СубконтоДт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоДт.Партии = строка.Партия;
Проводка.СубконтоДт.Склады = Склад;
Проводка.СубконтоКт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоКт.Партии = строка.Партия;
Проводка.СубконтоКт.Склады = Склад;
 
 
Проводка.Период = Дата;
Проводка.Организация = ТекУчреждение;
 
Проводка = Проводки.Добавить();
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыВРозничнойТорговлеВПродажныхЦенахАТТ;
Проводка.СчетКт = строка.Счет;
Проводка.Сумма = - строка.Сумма;
Проводка.КоличествоДт = 0;
Проводка.КоличествоКт = 0;
Проводка.СубконтоДт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоДт.Партии = строка.Партия;
Проводка.СубконтоДт.Склады = Склад;
Проводка.СубконтоКт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоКт.Партии = строка.Партия;
Проводка.СубконтоКт.Склады = Склад;
 
Проводка.Период = Дата;
Проводка.Организация = ТекУчреждение;
Проводки.Записать();
 
КонецЦикла;
 
НовДок.Записать();
 
Сообщить("документ "+новдок.Номер+" записан");
 
КонецПроцедуры
Заполнение документа ОперцияБух
 
 
какой сделать тип у "партии"?
Пустая партия
 
А такое обращение к субконто пробовали:
Проводка.СубконтоДт["Номенклатура"] = Выборка.Номенклатура; ?
 
PS. Зачем создаёте 2 проводки в 1 итерации цикла?
Если выгружаете результат запроса в таблицу значений, то цикл Для каждого. Но рекомендуется использовать не "Выгрузить()", а "Выбрать()". При этом получается выборка из результата запроса. Для обработки выборки требуется меньше ресурсов компьютера чем для таблицы значений.
Пробовала. так не получалось. а как щас у меня это получается. но не работает партия.
2 проводки потому что 1 проводка с кт 43 а вторая проводка с кт 42.01
ну по крайней мере мне наш консультатнт так объяснила)
А Номенклатура и Склад заполняются?
Судя по скрину, у вас не заполнена партия в текущей строке. Проверяли результат запроса в консоли?
я исправила) теперь всё заполняется. номенклатуру и склад тип справочники, а партии смешанный тип. вроде работает. =) спасибо что помогли)
Рад помочь) Обращайтесь ещё.
Отдавала обработку фирме. их не устраивает:
1. сумма не отображается по налоговому учёту.
2. 1 проводка ДТ сделала по рознице а КТ по основному складу. (а 2 проводка оба по основному. )
3. надо чтоб проводки очищались если уже записаны.
 
вот текст обработки:
 
Процедура КнопкаНайтиНажатие(Кнопка)
 
КонПериода = КонецМесяца(Дата);  
 
Счет = Новый Массив; 
//    41.01
Счет.добавить(планысчетов.хозрасчетный.ТоварыНаСкладах);
//    43
Счет.добавить(планысчетов.Хозрасчетный.ГотоваяПродукция);
 
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто2 КАК Партия,
| СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК Сумма,
| СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК Количество,
| ХозрасчетныйОстатки.Счет
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&КонПериода, Счет В (&Счет), , Субконто3 = &Склад) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.СуммаОстаток <> 0
| И ХозрасчетныйОстатки.КоличествоОстаток = 0
|
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.Субконто2,
| ХозрасчетныйОстатки.Счет";
 
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("Счет", Счет);
Запрос.УстановитьПараметр("Склад", Склад);
 
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Табличка.Загрузить(РезультатЗапроса);
 
 
КонецПроцедуры
 
Процедура КнопкаВыполнитьНажатие(Кнопка)
 
текУчреждение = справочники.Организации.НайтиПоКоду("000000001");
ф=0;
Комментарий = "Автоматическая обработка выбора остатков по счёту 41.01 и 43";
 
 
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ОперацияБух.Ссылка,
| ОперацияБух.Дата,
| ОперацияБух.Комментарий
|ИЗ
| Документ.ОперацияБух КАК ОперацияБух
|ГДЕ
| ОперацияБух.Комментарий ПОДОБНО &Комментарий
| И ОперацияБух.Дата = &Дата
| И ОперацияБух.ПометкаУдаления = &Ложь";
 
Запрос.УстановитьПараметр("Комментарий", Комментарий);
Запрос.УстановитьПараметр("Дата", КонецМесяца(Дата));
Запрос.УстановитьПараметр("Ложь", Ложь);
 
РезультатЗапроса = Запрос.Выполнить();
 
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
ДокНашли = Документы.ОперацияБух.ПустаяСсылка();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокНашли = ВыборкаДетальныеЗаписи.Ссылка;
ф=1; 
КонецЦикла;
 
 
если ф=0 тогда
 
НовДок = Документы.ОперацияБух.СоздатьДокумент();
НовДок.Дата = КонецМесяца(Дата);
НовДок.Организация = справочники.Организации.НайтиПоКоду("000000001");
НовДок.Комментарий = "Автоматическая обработка выбора остатков по счёту 41.01 и 43";
НовДок.Записать();
 
Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Проводки.Отбор.Регистратор.Установить(НовДок.Ссылка);
 
Для каждого строка из табличка Цикл 
Проводка = Проводки.Добавить();
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыВРозничнойТорговлеВПродажныхЦенахАТТ;
Проводка.СчетКт = строка.Счет;
Проводка.Сумма = строка.Сумма;
Проводка.КоличествоДт = 0;
Проводка.КоличествоКт = 0;
Проводка.СубконтоДт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоДт.Партии = строка.Партия;
Проводка.СубконтоДт.Склады = Склад;
Проводка.СубконтоКт.Номенклатура = строка.Номенклатура;
Проводка.СубконтоКт.Партии = строка.Партия;
Проводка.СубконтоКт.Склады = Склад;
 
 
Проводка.Период = Дата;
Проводка.Организация = ТекУчреждение;
Проводки.Записать();
 
КонецЦикла;
 
Для каждого строка2 из табличка Цикл 
Проводка = Проводки.Добавить();
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыВРозничнойТорговлеВПродажныхЦенахАТТ;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ТорговаяНаценкаАТТ;
Проводка.Сумма = - строка2.Сумма;
Проводка.КоличествоДт = 0;
Проводка.КоличествоКт = 0;
Проводка.СубконтоДт.Номенклатура = строка2.Номенклатура;
Проводка.СубконтоДт.Партии = строка2.Партия;
Проводка.СубконтоДт.Склады = Склад;
Проводка.СубконтоКт.Номенклатура = строка2.Номенклатура;
Проводка.СубконтоКт.Партии = строка2.Партия;
Проводка.СубконтоКт.Склады = Склад;
 
Проводка.Период = Дата;
Проводка.Организация = ТекУчреждение;
Проводки.Записать();    
 
 
КонецЦикла;
 
НовДок.Записать();
 
Сообщить("документ "+новдок.Номер+" записан");
 
Иначе 
сообщить("такой документ уже существует.");
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Такой документ существует. Перезаписать?", Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
Иначе 
ДокНашли.Движения.Хозрасчётный.Очистить();
 
 
 
КонецЕсли;
 
конецесли;
КонецПроцедуры
 
{Форма.Форма.Форма(140)}: Значение не является значением объектного типа (Движения)
НовДок.Движения.Хозрасчётный.Очистить();
 
 
Сначала отвечу на ваши вопросы:
  1. Чтобы отображалась сумма по налоговому учёту нужно добавить соответствующие движения (проводки).
  2. Какой-то нонсенс. В отладчике смотрели, что пишется в Субконто3?
  3. Если вы про ДокНашли.Движения.Хозрасчётный.Очистить();, то сначала нужно получить объект документа, а потом уже очищать движения:
ДокНашлиОбъект = ДокНашли.ПолучитьОбъект();
ДокНашлиОбъект.Движения.Хозрасчётный.Очистить();
 
И немного комментариев к самой реализации. 
Много лишнего в коде процедур.
Крупные недостатки, сильно влияющих на скорость выполнения обработки:
  • Зачем 2 цикла обхода строк? Чем не устраивает создание 2 проводок в 1 цикле?
  • Зачем после каждого добавления проводки записывать весь набор записей? Это достаточно сделать 1 раз после добавления всех записей в набор.
 
{Форма.Форма.Форма(141)}: Поле объекта не обнаружено (Хозрасчётный)
ДокНашлиОбъект.Движения.Хозрасчётный.Очистить();
 
 
  1. Чтобы отображалась сумма по налоговому учёту нужно добавить соответствующие движения (проводки).
поточнее можно?)
 
я решила в таблицу добавить поле НалоговыйУчет и оттуда уже брать данные для проводки. так получится?
По ошибке: посмотрите в отладчике, что у вас находится в ДокНашлиОбъект.Движения. У меня такой ошибки не выпадает.
Попробуйте очистить движения таким образом:

	Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
	Проводки.Отбор.Регистратор.Установить(ДокНашли);
	Проводки.Записать();
И что планируете заносить в поле НалоговыйУчет?
 
По идее, нужно выделять из суммы сумму НДС и делать проводку по соответствующему счету.
Заполнение Суммы НУкороче мне просто нужно чтоб это дублирлвалось там)))
 
 
в Таблицу добавила поле 
 
Заполнение Суммы НУ в обработке
как сделать чтоб в проводке была эта сумма из таблицы. 
проводка.ну = строка.НУ; выдаёт ошибку)))
 
чтоб очищалось и перезаписывалось сделала. помогло) а реально сделать чтоб пустой документ он пометил на удаление?)
Что-то я не в ту степь с налоговым учётом пошёл...)
В регистре ресурс называется СуммаНУ. Попробуйте так: проводка.СуммаНУ = строка.НУ; 
В принципе можно и не создавать дополнительной колонки в таблице, а СуммуНУ заполнять из Суммы.

Страницы