Як один із варіантів код формування ОСВ можна перемістити у форму зовнішньої обробки в процедуру "ПриОткрытии" а саму обробку запускати через планувальник windows
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе"); Отказ = Истина; КонецЕсли; КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если НЕ(РежимЗаписи = РежимЗаписиДокумента.Проведение) Тогда Возврат; КонецЕсли;
Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |ПОМЕСТИТЬ ТоварыДок |ИЗ | Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл |ГДЕ | РасходнаяНакладнаяТЧРасхНакл.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыДок.ТМЦ, | ЕСТЬNULL(ТМЦОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ТоварыДок КАК ТоварыДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки( | &Дата, | ТМЦ В | (ВЫБРАТЬ | ТоварыДок.ТМЦ | ИЗ | ТоварыДок КАК ТоварыДок) | И Склад = &Склад) КАК ТМЦОстатки | ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Отбор = Новый Структура;
Пока ВыборкаИзЗапроса.Следующий() Цикл
Отбор.Вставить("ТМЦ", ВыборкаИзЗапроса.ТМЦ); МассивВозможныхДублей = ТЧРасхНакл.НайтиСтроки(Отбор); Для Каждого Товар Из МассивВозможныхДублей Цикл
Если ВыборкаИзЗапроса.КоличествоОстаток = 0 Тогда УчЦена = 0; Иначе УчЦена = ВыборкаИзЗапроса.СуммаОстаток/ВыборкаИзЗапроса.КоличествоОстаток; КонецЕсли;
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Отбор = Новый Структура;
Пока ВыборкаИзЗапроса.Следующий() Цикл
Отбор.Вставить("ТМЦ", ВыборкаИзЗапроса.ТМЦ); МассивВозможныхДублей = ТЧРасхНакл.НайтиСтроки(Отбор); Для Каждого Товар Из МассивВозможныхДублей Цикл
Если ВыборкаИзЗапроса.КоличествоОстаток = 0 Тогда УчЦена = 0; Иначе УчЦена = ВыборкаИзЗапроса.СуммаОстаток/ВыборкаИзЗапроса.КоличествоОстаток; КонецЕсли;
ЛевоеСоединение в данном случае значит: Выбрать все записи с табличной части и к ним присоединить количествоОстаток из регистра ТМЦ, по условию, что ТоварТЧ = Товар в регистре (Строка в Запросе
| ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
)
Цитата
Остатки из временной таблицы переносятся в остатки регистра накопления ТМЦОстатки или что((?
Не переносятся, а присоединяются. Как описано выше.
Если я правильно вас понял. УчЦена в документе расходной это та цена по которой этот товар закупили. А УчСумма соответсвенно стоимость по которой закупили. То получиться чтото вроде этого
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | РасходнаяНакладнаяТЧРасхНакл.ТМЦ, | СУММА(РасходнаяНакладнаяТЧРасхНакл.Количество) КАК Количество |ПОМЕСТИТЬ ТоварыДок |ИЗ | Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл |ГДЕ | РасходнаяНакладнаяТЧРасхНакл.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыДок.ТМЦ, | ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ТоварыДок.Количество, | ЕСТЬNULL(ТМЦОстатки.СуммаОстаток, 0) КАК СуммаОстаток |ИЗ | ТоварыДок КАК ТоварыДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки( | &Дата, | ТМЦ В | (ВЫБРАТЬ | ТоварыДок.ТМЦ | ИЗ | ТоварыДок КАК ТоварыДок)) КАК ТМЦОстатки | ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе"); Отказ = Истина; КонецЕсли;
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе"); Отказ = Истина; КонецЕсли; КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если НЕ(РежимЗаписи = РежимЗаписиДокумента.Проведение) Тогда Возврат; КонецЕсли;
Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |ПОМЕСТИТЬ ТоварыДок |ИЗ | Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыДок.ТМЦ, | ЕСТЬNULL(ТМЦОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ТоварыДок КАК ТоварыДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки( | &Дата, | ТМЦ В | (ВЫБРАТЬ | ТоварыДок.ТМЦ | ИЗ | ТоварыДок КАК ТоварыДок) | И Склад = &Склад) КАК ТМЦОстатки | ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Проверка на остаток лучше делать в процедуре "ОбработкаПроведения".
Вообще, запрос в цикле для проверки остатка (и вобще) это мягко говоря не красиво.
я бы проверил остатки тех товаров которые в документе так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | РасходнаяНакладнаяТЧРасхНакл.ТМЦ, | СУММА(РасходнаяНакладнаяТЧРасхНакл.Количество) КАК Количество |ПОМЕСТИТЬ ТоварыДок |ИЗ | Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл |ГДЕ | РасходнаяНакладнаяТЧРасхНакл.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТЧРасхНакл.ТМЦ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыДок.ТМЦ, | ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ТоварыДок.Количество |ИЗ | ТоварыДок КАК ТоварыДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки( | &Дата, | ТМЦ В | (ВЫБРАТЬ | ТоварыДок.ТМЦ | ИЗ | ТоварыДок КАК ТоварыДок)) КАК ТМЦОстатки | ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Дата", Дата);
Результат = Запрос.Выполнить(); ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе"); Отказ = Истина; КонецЕсли; КонецЦикла;
КонецПроцедуры
Рассчитать УчЦену и УчСумму. тут не понятно, куда ее алгоритм должен заполнять. Если в документ расходной то не понятен практический смысл от этого. Может все таки нужно списать товары с регистра ТМЦ?
СписокОтбора = ОтобратьЗначения(Текст); //Здесь возвращаем запросом найденные результаты в виде списка значений Если СписокОтбора.Количество()<2 Тогда ЭлементыФормы.Удалить(СписокВыбора); мПолеПодбора = Неопределено; Иначе СписокВыбора.Значение = СписокОтбора; СписокВыбора.Высота = 20*СписокОтбора.Количество(); КонецЕсли;
Если СписокОтбора.Количество()=1 Тогда ТекстАвтоПодбора = СписокОтбора[0].Значение; КонецЕсли;
Проблема решена. Оказалось, проблема была в договоре. В реквизите "договор" во всех документах по данному контрагенту договор только отображался, но на самом деле его не было если перейти по ссылке. Создали новый договор и все ОК. Спасибо кто заглядывал в тему и уделял внимание!
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!