Каждый день мы сталкиваемся с проблемой недостачи товара на складе нашей фирме при реализации товара, часто недостоющее количество имеется на складе собственной фирмы - поэтому в ТиС приходится делать "Продажа собственной фирме". Решили дописать реализацию: ввели дополнительный справочник для правил продаж собственным фирмам (ППСФ). При оформлении документа реализация розничная необходимо было сначало проверить наличие товара на складе у себя (программно), потом если недостаточно количества обротится к ППСФ и посмотреть на складе собственной фирмы. Если есть то оформляем реализацию и поступление на наш склад для дальнейшей розничной реализации. При написании возникли проблемы с определением в какой момент нужно сделать проверку и доприходывание недостающего товара на склад от собственной фирмы - в обработке проведения документа нельзя создать и провести документы созданные для этих целей, а в процедуре ПриЗаписи() - есть вероятность сделать ненужное доприходывание товаров.
Вдобавок при реализации создании необходимых документов в самих документах расчитывает неверно в чем ошибка я незнаю.
Вот код:
Подскажите как сделать это если простое нажатие по кнопке доукомплектовать ТМЦ со складов собственых фирм не приемлемо.
Может кто-то это чудо делал для себя????
Вдобавок при реализации создании необходимых документов в самих документах расчитывает неверно в чем ошибка я незнаю.
Вот код:
ВремРегистр=СоздатьОбъект("Регистры");
ТаблицаНедостатков=СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТаблицаНедостатков);
ОстаткиТМЦ=ВремРегистр.ОстаткиТМЦ;
ТаблицаНедостатков.НоваяКолонка("ЦенаПрод");
ТаблицаНедостатков.ВыбратьСтроки();
Пока ТаблицаНедостатков.ПолучитьСтроку()=1 Цикл
Если (ТаблицаНедостатков.Номенклатура.ВидНоменклатуры=Перечисление.ВидыНоменклатуры.Услуга)
Или (ТаблицаНедостатков.Номенклатура.ВидНоменклатуры=Перечисление.ВидыНоменклатуры.Работа) Тогда
ТаблицаНедостатков.УдалитьСтроку();
Продолжить;
КонецЕсли;
ОстатокНоменклатуры=ОстаткиТМЦ.СводныйОстаток(Фирма,ТаблицаНедостатков.Номенклатура,Склад,,"Количество");
Если ОстатокНоменклатуры<ТаблицаНедостатков.Количество Тогда
ТаблицаНедостатков.Количество=ТаблицаНедостатков.Количество-ОстатокНоменклатуры;
Иначе
ТаблицаНедостатков.УдалитьСтроку();
Продолжить;
КонецЕсли;
КонецЦикла;
Если ТаблицаНедостатков.КоличествоСтрок()<>0 Тогда
ПравилаПродажФирмам=СоздатьОбъект("Справочник.ПланыОбмена");
Если ПравилаПродажФирмам.НайтиПоРеквизиту("ФирмаПокупатель",Фирма,1)=1 Тогда
ОптФирма=ПравилаПродажФирмам.ФирмаПоставщик;
ОптСклад=ПравилаПродажФирмам.СкладПоставщика;
ТипЦенРеализации=ПравилаПродажФирмам.ТипЦенРеализации;
Иначе
СтатусВозврата(0);
Возврат;
КонецЕсли;
Параметры=СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(ТекущийДокумент(),"ТекДок");
Параметры.ДобавитьЗначение(Склад, "Склад");
Параметры.ДобавитьЗначение(Фирма, "Фирма");
Параметры.ДобавитьЗначение(ОптФирма,"ФирмаДляОстатковТМЦ");
Параметры.ДобавитьЗначение("", "Контрагент");
Параметры.ДобавитьЗначение("", "Договор");
ОстаткиВсе=ВремРегистр.ОстаткиТМЦ;
ВремРезервыТМЦ=ВремРегистр.РезервыТМЦ;
РезПроверки = ПроверкаОстатковТМЦНаОпте (Контекст,ТаблицаНедостатков,Параметры, ОстаткиВсе, ОптСклад, ВремРезервыТМЦ);
Если РезПроверки <>0 Тогда
//ТаблицаНедостатков.ВыбратьСтроки();
//Пока ТаблицаНедостатков.ПолучитьСтроку()=1 Цикл
//
//КонецЦикла;
НачатьТранзакцию();
РеализацияСобственнойФирме=Создатьобъект("Документ.Реализация");
РеализацияСобственнойФирме.Новый();
РеализацияСобственнойФирме.ДатаДок = ДатаДок;
РеализацияСобственнойФирме.АвтоВремяНачалоДня();
РеализацияСобственнойФирме.Фирма=ОптФирма;
РеализацияСобственнойФирме.Склад=ОптСклад;
РеализацияСобственнойФирме.Контрагент=ПравилаПродажФирмам.КонтрагентПосредник;
Если ПустоеЗначение(ПравилаПродажФирмам.ДоговорПродажи)=1 Тогда
РеализацияСобственнойФирме.Договор=РеализацияСобственнойФирме.Контрагент.ОсновнойДоговор;
Иначе
РеализацияСобственнойФирме.Договор=ПравилаПродажФирмам.ДоговорПродажи;
КонецЕсли;
РеализацияСобственнойФирме.ТипЦен=ТипЦенРеализации;
РеализацияСобственнойФирме.Валюта=ТипЦенРеализации.Валюта;
РеализацияСобственнойФирме.УчитыватьНП=ТипЦенРеализации.ЦенаВклНП;
РеализацияСобственнойФирме.УчитыватьНДС=ТипЦенРеализации.ЦенаВклНДС;
// уникальные реквизиты шапки
РеализацияСобственнойФирме.КодОперации = глКО.Продажа;
РеализацияСобственнойФирме.ДатаОплаты = ДатаДок;
РеализацияСобственнойФирме.ЗагрузитьТабличнуюЧасть(ТаблицаНедостатков);
//**************************
// Цикл по всем товарам в документе
РеализацияСобственнойФирме.ВыбратьСтроки();
Пока РеализацияСобственнойФирме.ПолучитьСтроку() = 1 Цикл
ТекТМЦ = РеализацияСобственнойФирме.Номенклатура;
// Получаем цену
ПЦена = 0;
ПЕдиницаКонт = РеализацияСобственнойФирме.Единица;
ПЕдиницаЦены = ПЕдиницаКонт;
ПВалютаЦены = ТипЦенРеализации.Валюта;
ПЦенаВклНП = ТипЦенРеализации.ЦенаВклНП;
ПЦенаВклНДС = ТипЦенРеализации.ЦенаВклНДС;
Если глВернутьЦену(ТекТМЦ, РеализацияСобственнойФирме.ТипЦен, РеализацияСобственнойФирме.ДатаДок, ПЦена, ПЕдиницаЦены, ПВалютаЦены) = 1 Тогда
// Приводим к одной единице (если в документе она есть)
Если ПЕдиницаЦены.Коэффициент <> РеализацияСобственнойФирме.Коэффициент Тогда
Если ПЕдиницаЦены.Коэффициент <> 0 Тогда
ПЦена = (ПЦена * РеализацияСобственнойФирме.Коэффициент) / ПЕдиницаЦены.Коэффициент;
КонецЕсли;
КонецЕсли;
глПересчитатьЦенуВДокументе(РеализацияСобственнойФирме, РеализацияСобственнойФирме.УчитыватьНП, РеализацияСобственнойФирме.УчитыватьНДС, ПЦена, ПВалютаЦены, ПЦенаВклНП, ПЦенаВклНДС);
Иначе
РеализацияСобственнойФирме.Цена = 0;
КонецЕсли;
КонецЦикла;
глПересчетТаблЧасти(РеализацияСобственнойФирме,"Цена");
РеализацияСобственнойФирме.Комментарий = "Продажа собственной фирме";
РеализацияСобственнойФирме.Записать();
РеализацияСобственнойФирме.Провести();
Если РеализацияСобственнойФирме.Проведен() = 0 Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
ТаблицаНедостатков.Очистить();
РеализацияСобственнойФирме.ВыгрузитьТабличнуюЧасть(ТаблицаНедостатков);
ДокПоступление=Создатьобъект("Документ.ПоступлениеТМЦ");
ДокПоступление.Новый();
ДокПоступление.ДатаДок = ДатаДок;
Ч=0; М=0; С=0;
РеализацияСобственнойФирме.ПолучитьВремя(Ч,М,С);
ДокПоступление.ПолучитьВремя(Ч,М+1,С);
// идентичные реквизиты шапки
СкопироватьРеквизитыШапки(РеализацияСобственнойФирме, ДокПоступление);
// отличающиеся реквизиты шапки
ДокПоступление.Фирма = Фирма;
ДокПоступление.УстановитьНовыйНомер(Фирма.ЮрЛицо.ПрефиксНомеровДокументов);
ДокПоступление.Контрагент = ПравилаПродажФирмам.КонтрагентПосредник;
Если ПустоеЗначение(ПравилаПродажФирмам.ДоговорПродажи)=1 Тогда
ДокПоступление.Договор=ДокПоступление.Контрагент.ОсновнойДоговор;
Иначе
ДокПоступление.Договор=ПравилаПродажФирмам.ДоговорПродажи;
КонецЕсли;
ДокПоступление.Склад = Склад;
// уникальные реквизиты шапки
ДокПоступление.КодОперации = глКО.Закупка;
ДокПоступление.ДатаОплаты = ДатаДок;
// табличная часть
РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");
ТабПартий = СоздатьОбъект("ТаблицаЗначений");
ДокПоступление.ВыгрузитьТабличнуюЧасть(ТабПартий);
ТабПартий.НоваяКолонка("ГТД", "Справочник.ГТД");
ТабПартий.НоваяКолонка("СтранаПроисхождения", "Справочник.ОКСМ");
ТабПартий.НоваяКолонка("Свойство", "Справочник.ЗначенияСвойств");
РеализацияСобственнойФирме.ВыбратьСтроки();
ТабДвижений = СоздатьОбъект("ТаблицаЗначений");
ТабДвижений.НоваяКолонка("НомСтроки", "Число", 19, 3);
ТабДвижений.НоваяКолонка("Количество", "Число", 19, 3);
ТабДвижений.НоваяКолонка("ГТД", "Справочник.ГТД");
ТабДвижений.НоваяКолонка("СтранаПроисхождения", "Справочник.ОКСМ");
ТабДвижений.НоваяКолонка("Свойство", "Справочник.ЗначенияСвойств");
РегПартии.ВыбратьДвиженияДокумента(РеализацияСобственнойФирме.ТекущийДокумент());
Пока РегПартии.ПолучитьДвижение()=1 Цикл
ТабДвижений.НоваяСтрока();
ТабДвижений.НомСтроки = РегПартии.НомерСтроки();
ТабДвижений.Количество = РегПартии.Количество;
ТабДвижений.ГТД = РегПартии.Партия.ГТД;
ТабДвижений.СтранаПроисхождения = РегПартии.Партия.СтранаПроисхождения;
ТабДвижений.Свойство = РегПартии.Партия.Свойство;
КонецЦикла;
ТабДвижений.Свернуть("НомСтроки, ГТД, СтранаПроисхождения, Свойство", "Количество");
Пока РеализацияСобственнойФирме.ПолучитьСтроку() = 1 Цикл
// Посчитаем количество строк по данной строке документа в таблице движений
КолСтрок = 0;
ТабДвижений.ВыбратьСтроки();
Пока ТабДвижений.ПолучитьСтроку() = 1 Цикл
Если ТабДвижений.НомСтроки = РеализацияСобственнойФирме.НомерСтроки Тогда
КолСтрок = КолСтрок + 1;
КонецЕсли;
КонецЦикла;
// Если в таблице движений больше одной строки, то придется разбивать
// по ГТД и стране происхождения
Если КолСтрок > 1 Тогда
ОстСумма = РеализацияСобственнойФирме.Сумма;
ОстНДС = РеализацияСобственнойФирме.СуммаНДС;
ОстНП = РеализацияСобственнойФирме.СуммаНП;
Для к = 1 по ТабДвижений.КоличествоСтрок() Цикл
ТабДвижений.ПолучитьСтрокуПоНомеру(к);
Если ТабДвижений.НомСтроки <> РеализацияСобственнойФирме.НомерСтроки Тогда
Продолжить;
КонецЕсли;
ТабПартий.НоваяСтрока();
ТабПартий.Номенклатура = РеализацияСобственнойФирме.Номенклатура;
ТабПартий.Количество = ТабДвижений.Количество;
ТабПартий.Единица = РеализацияСобственнойФирме.Единица;
ТабПартий.Коэффициент = РеализацияСобственнойФирме.Коэффициент;
ТабПартий.Цена = РеализацияСобственнойФирме.Цена;
ТабПартий.Сумма = ?(к = ТабДвижений.КоличествоСтрок(), ОстСумма,
РеализацияСобственнойФирме.Сумма * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
ТабПартий.СуммаНДС = ?(к = ТабДвижений.КоличествоСтрок(), ОстНДС,
РеализацияСобственнойФирме.СуммаНДС * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
ТабПартий.СуммаНП = ?(к = ТабДвижений.КоличествоСтрок(), ОстНП,
РеализацияСобственнойФирме.СуммаНП * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
ТабПартий.СтавкаНДС = РеализацияСобственнойФирме.СтавкаНДС;
ТабПартий.СтавкаНП = РеализацияСобственнойФирме.СтавкаНП;
ТабПартий.ГТД = ТабДвижений.ГТД;
ТабПартий.СтранаПроисхождения = ТабДвижений.СтранаПроисхождения;
ТабПартий.Свойство = ТабДвижений.Свойство;
ОстСумма = ОстСумма - ТабПартий.Сумма;
ОстНДС = ОстНДС - ТабПартий.СуммаНДС;
ОстНП = ОстНП - ТабПартий.СуммаНП;
КонецЦикла;
Иначе
// Если в таблице движений только одна сторока или меньше можно
// копировать строку документа реализации без изменений
ТабПартий.НоваяСтрока();
ТабПартий.Номенклатура = РеализацияСобственнойФирме.Номенклатура;
ТабПартий.Количество = РеализацияСобственнойФирме.Количество;
ТабПартий.Единица = РеализацияСобственнойФирме.Единица;
ТабПартий.Коэффициент = РеализацияСобственнойФирме.Коэффициент;
ТабПартий.Цена = РеализацияСобственнойФирме.Цена;
ТабПартий.СтавкаНДС = РеализацияСобственнойФирме.СтавкаНДС;
ТабПартий.СтавкаНП = РеализацияСобственнойФирме.СтавкаНП;
ТабПартий.Сумма = РеализацияСобственнойФирме.Сумма;
ТабПартий.СуммаНДС = РеализацияСобственнойФирме.СуммаНДС;
ТабПартий.СуммаНП = РеализацияСобственнойФирме.СуммаНП;
// Если строка в таблице движений есть, надо запомнимть ГТД и
// страну происхождения для формирования партии
ТабДвижений.ВыбратьСтроки();
Пока ТабДвижений.ПолучитьСтроку() = 1 Цикл
Если ТабДвижений.НомСтроки <> РеализацияСобственнойФирме.НомерСтроки Тогда
Продолжить;
КонецЕсли;
ТабПартий.ГТД = ТабДвижений.ГТД;
ТабПартий.СтранаПроисхождения = ТабДвижений.СтранаПроисхождения;
ТабПартий.Свойство = ТабДвижений.Свойство;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТабПартий.Свернуть("Номенклатура, Количество, Цена, Единица, Коэффициент, СтавкаНДС, СтавкаНП, ГТД, СтранаПроисхождения, Свойство",
"Сумма, СуммаНДС, СуммаНП, Партия");
СпрПартий = СоздатьОбъект("Справочник.Партии");
ТабПартий.ВыбратьСтроки();
Пока ТабПартий.ПолучитьСтроку() = 1 Цикл
Попытка
СпрПартий.ИспользоватьВладельца(ТабПартий.Номенклатура);
СпрПартий.Новый();
СпрПартий.ГТД = ТабПартий.ГТД;
СпрПартий.СтранаПроисхождения = ТабПартий.СтранаПроисхождения;
СпрПартий.Свойство= ТабПартий.Свойство;
СпрПартий.Записать();
ТабПартий.Партия = СпрПартий.ТекущийЭлемент();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
КонецЦикла;
ДокПоступление.ЗагрузитьТабличнуюЧасть(ТабПартий);
ДокПоступление.Записать();
ДокПоступление.ВыбратьСтроки();
ДокПоступление.НомерДокВходящий = РеализацияСобственнойФирме.НомерДок;
ДокПоступление.ДатаДокВходящий = РеализацияСобственнойФирме.ДатаДок;
Пока ДокПоступление.ПолучитьСтроку() = 1 Цикл
ДокПоступление.ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
КонецЦикла;
ДокПоступление.Комментарий = "Продажа собственной фирме";
ДокПоступление.Записать();
ДокПоступление.Провести(1);
Если ДокПоступление.Проведен() = 0 Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
ПоказатьПодскажите как сделать это если простое нажатие по кнопке доукомплектовать ТМЦ со складов собственых фирм не приемлемо.
Может кто-то это чудо делал для себя????
По теме из базы знаний
- Выравнивание счетов 60(01,02) и 62(01,02), когда остатки есть одновременно на каждом счете, и регистров Расчеты по реализации и Расчеты по поступлению в соответствии с БУ
- Автоматическое создание и выставление периодических счетов, актов и реализаций на услуги для 1С: Бухгалтерии 3.0
- Как читать чужой код? Часть 2. Доработка типовой конфигурации. Обновление доработанной типовой конфигурации
- Доп. расход в Реализации товаров УТ11. Печать Счета/УПД с учетом доп. расхода. Доработка для для выгрузки УПД с учетом доп. расхода
- Взаимозачёт (зачёт аванса) в документах - "Корректировка поступления" и "Корректировка реализации". БП 3.0
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Думаю как-то вот так:
Если Проведен()=0 Тогда
Записать();
ПараметрПроведения=0;
Если Вопрос("Провести документ?","Да+Нет")="Да" Тогда
ПодготовитьДанныеДляПроведения(ПараметрПроведения);
Если ПараметрПроведения=1 Тогда
Провести();
Форма.Закрыть(0);
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот