|
v7: Проверка по остаткам и добавление строчки | ☑ | ||
---|---|---|---|---|
0
msk-07
20.04.13
✎
11:26
|
Подскажите, как в документе инвентаризация тмц добавить кнопку, чтобы та добавляла в табличную часть документа того, что туда не было добавлено. Буду очень признателен просто за ваши идеи и ответы.
|
|||
1
aka AMIGO
20.04.13
✎
11:29
|
у меня кнопка "Заполнить" на форме.. удаляет строки, заполняет заново по остаткам
всех устраивает зы. идее лет этак с 10-12 будет.. |
|||
2
msk-07
20.04.13
✎
11:31
|
ага, вот только моих это не устраивает. Мне просто нужно сделать проверку чтобы в цикле прогнать табличную часть и если каких-то остатков там не будет то добавить строчку, все понимаю, но как в коде написать не знаю
|
|||
3
msk-07
20.04.13
✎
11:38
|
Пожалуйста помогите, не за просто так...очень хочу разобраться.
|
|||
4
msk-07
20.04.13
✎
11:54
|
Еще раз напишу, кто мне может помочь по 7.7, не бесплатно, просто нужен совет как это организовать, ни чего большего..дальше напишу сам
|
|||
5
Ganiev
20.04.13
✎
13:35
|
выгрузи ТЧ в список , сделай прямой запрос с проверкой на остаток и не в списке который ты выгрузил, полученным заполни ТЧ!
|
|||
6
Эльниньо
20.04.13
✎
14:53
|
(5) Ну прям у нас тут все мегаспецы по прямым.
(0) Рег.ВыгрузитьИтоги(ТЗ) и сравнить с ТЧ |
|||
7
aka AMIGO
20.04.13
✎
15:24
|
(6) у тс может быть бухия
|
|||
8
Dolly_EV
20.04.13
✎
15:31
|
Процедура ПолучитьОстатки(СписТоваров, ТолькоОстатки, ОстаткиТМЦ, ОстаткиПартий)
ВремРегистры = СоздатьОбъект("Регистры"); РегОстатки = ВремРегистры.ПартииТоваров; РегОстатки.УстановитьЗначениеФильтра("Фирма", Фирма, 1); РегОстатки.УстановитьЗначениеФильтра("Склад", МестоХранения, 1); Если ПустоеЗначение(СписТоваров) = 0 Тогда РегОстатки.УстановитьЗначениеФильтра("Товар", СписТоваров, 2); КонецЕсли; // в этом случае надо сделать временный расчет итогов Если Выбран() = 0 Тогда // Новый документ Если ДатаДок < ПолучитьДатуТА() Тогда // выписываемый задним числом РегОстатки.ВременныйРасчет(); ВремРегистры.РассчитатьРегистрыПо(ДатаДок); КонецЕсли; Иначе // Сохраненный документ. Если СравнитьТА() < 1 Тогда //Позиция не больше ТА. РегОстатки.ВременныйРасчет(); ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли; КонецЕсли; ОстаткиТМЦ = СоздатьОбъект("ТаблицаЗначений"); РегОстатки.ВыгрузитьИтоги(ОстаткиТМЦ, 1, 1); ОстаткиПартий = ОстаткиТМЦ; //ОстаткиТМЦ.ВыбратьСтроку(); //ОстаткиПартий.ВыбратьСтроку(); КонецПроцедуры // ПолучитьОстатки() //****************************************************************************** // ЗаполнениеПоСкладу(ТипЗаполнения) // // Параметры: // ТипЗаполнения - строка - "Обновить" или "Перезаполнить" // // Возвращаемое значение: // Пустая строка // // Описание: // Производит заполнение инвентаризации по складу. // Функция ЗаполнениеПоСкладу(ТипЗаполнения) Перем ТаблСуммы, ТаблОстатков; Перем СписТоваров, ВидЗаполнения; //СписокТЗап = СоздатьОбъект("СписокЗначений"); //СписокТЗап.ДобавитьЗначение("По виду алкоголя"); //СписокТЗап.ДобавитьЗначение("По группе товара"); //Если СписокТЗап.ВыбратьЗначение(ВидЗаполнения, , , 60, 1) <> 1 Тогда // Возврат ""; //КонецЕсли; Если ПоГрТоваров=1 Тогда Если ГрТоваров.РазмерСписка()=0 Тогда Сообщить("Не выбраны группы товаров для заполнения!"); Возврат ""; КонецЕсли; КонецЕсли; Если ПоВидуАлк=1 Тогда Если ПустоеЗначение(ВидАлк) = 1 Тогда Сообщить("Не выбран вид алкоголя!"); Возврат ""; КонецЕсли; КонецЕсли; Если ТипЗаполнения = "Обновить" Тогда ТаблФакт = СоздатьОбъект("ТаблицаЗначений"); СписТоваров = "";//СоздатьОбъект("СписокЗначений"); ВыгрузитьТабличнуюЧасть(ТаблФакт); //ВыгрузитьТабличнуюЧасть(СписТоваров,"Товар"); ТаблФакт.Свернуть("Товар", "Количество"); УдалитьСтроки(); Иначе Ответ=Вопрос("При перезаполнении существующие строки будут удалены"+РазделительСтрок+ "и документ перезаполнится по остаткам (введенное фактич. кол-во пропадет!!)."+РазделительСтрок+ "Продолжить?","Да+Нет"); Если Ответ="Нет" Тогда Возврат ""; КонецЕсли; УдалитьСтроки(); КонецЕсли; //Перезаполним по остаткам в любом случае ПолучитьОстатки(СписТоваров, 0, ТаблОстатков, ТаблСуммы); ТаблОстатков.Свернуть("Товар", "Количество,Сумма,НДС"); ТаблОстатков.ВыбратьСтроки(); Пока ТаблОстатков.ПолучитьСтроку() = 1 Цикл Если ТаблОстатков.Количество = 0 Тогда Продолжить; КонецЕсли; Если ПоГрТоваров=1 Тогда Если ГрТоваров.Принадлежит(ТаблОстатков.Товар)=0 Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПоВидуАлк=1 Тогда Если алкЕстьАлкоголь(ТаблОстатков.Товар) = 0 Тогда продолжить; КонецЕсли; Если ТаблОстатков.Товар.Алкоголь.ВидАлкоголя<>ВидАлк Тогда Продолжить; КонецЕсли; КонецЕсли; НоваяСтрока(); Товар = ТаблОстатков.Товар; КоличествоУчет = ТаблОстатков.Количество; Количество = ?(ФактРавноУчет="Да",КоличествоУчет,0); Единица = Товар.БазоваяЕдиница; Коэффициент = Единица.Коэффициент; НомСтр = 0; СуммаУчет = ТаблОстатков.Сумма+ТаблОстатков.НДС; //по типу цен Сумма = СуммаУчет; Цена = ?(КоличествоУчет = 0,0, СуммаУчет / КоличествоУчет); КонецЦикла; Если ТипЗаполнения = "Обновить" Тогда //Надо добавить факт на Перезаполненную табличку!! ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл поз=""; Если ТаблФакт.НайтиЗначение(Товар,поз,"Товар") = 1 Тогда ТаблФакт.ПолучитьСтрокуПоНомеру(поз); Если ТаблФакт.Количество <> 0 Тогда Количество=ТаблФакт.Количество; КонецЕсли; ТаблФакт.УдалитьСтроку(); КонецЕсли; КонецЦикла; Если ТаблФакт.КоличествоСтрок()>0 Тогда Предупреждение("Остались позиции, которых нет по учетным остаткам,"+РазделительСтрок+ "но есть фактические остатки - строки будут добавлены"+РазделительСтрок+ "в конец табличной части Инвентаризации, начиная со строки № "+Строка(КоличествоСтрок()+1),3); ТаблФакт.ВыбратьСтроки(); Пока ТаблФакт.ПолучитьСтроку()=1 Цикл Если ТаблФакт.Количество = 0 Тогда продолжить; КонецЕсли; НоваяСтрока(); Товар=ТаблФакт.Товар; КоличествоУчет=0; Количество=ТаблФакт.Количество; Единица = Товар.БазоваяЕдиница; Коэффициент = Единица.Коэффициент; КонецЦикла; КонецЕсли; Иначе //нихера не делаем - все сделано уже КонецЕсли; Возврат ""; КонецФункции // ЗаполнениеПоСкладу() //****************************************************************************** // ЗаполнитьИзТерминала() // // Параметры: // Нет. // // Возвращаемое значение: // Пустая строка. // // Описание: // Заполняет табличную часть из терминала сбора данных. Вызывается по кнопке // Заполнить, если терминал сбора данных подключен. // //Функция ЗаполнитьИзТерминала() // Перем ВремТовар, ВремЕдиница, ВремКоличество; // Перем ТаблОстатков, ТаблСуммы; // Перем ТермДанные; // Перем ТаблЧасть; // // Если глТерминалЗагрузитьДанные(ТермДанные) = 0 Тогда // Возврат ""; // КонецЕсли; // // Если ТермДанные.КоличествоСтрок() = 0 Тогда // Предупреждение("Из терминала сбора данных не загружено ни одного товара", 60); // Иначе // // ДобТовары = СоздатьОбъект("ТаблицаЗначений"); // ДобТовары.НоваяКолонка("Товар"); // ДобТовары.НоваяКолонка("Единица"); // ДобТовары.НоваяКолонка("РеалКоличество"); // // ТермДанные.ВыбратьСтроки(); // Пока ТермДанные.ПолучитьСтроку() = 1 Цикл // Если глПолучитьТоварПоШтрихкоду(ТермДанные.Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество) = 0 Тогда // // штрихкод не найден. сохраним номер строки для дальнейшего ее удаления // Сообщить("Товар со штрихкодом " + ТермДанные.Штрихкод + " не найден!"); // Иначе // ДобТовары.НоваяСтрока(); // ДобТовары.Товар = ВремТовар; // ДобТовары.Единица = ВремЕдиница; // // для штучных ВремКоличество = 1, для весовых - вес из штрихкода // ДобТовары.РеалКоличество = ВремКоличество * ТермДанные.Количество; // КонецЕсли; // КонецЦикла; // // ДобТовары.Свернуть("Товар,Единица", "РеалКоличество"); // // ВыгрузитьТабличнуюЧасть(ТаблЧасть); // ТаблЧасть.Сортировать("Товар"); // // СписТоваров = СоздатьОбъект("СписокЗначений"); // ДобТовары.Выгрузить(СписТоваров,,,"Товар"); // // ПоСкладу = Перечисление.ВидыИнвентаризаций.ПоСкладу; // // Если ВидОперации = ПоСкладу Тогда // ПолучитьОстатки(СписТоваров, 0, ТаблОстатков, ТаблСуммы); // ТаблСуммы.Свернуть("Товар","Количество,СуммаБезНДС"); // ТаблОстатков.Свернуть("Товар" + ?(ВидОперации = ПоСкладу, "", ",ЦенаПрод"), "Количество"); // ТаблОстатков.Сортировать("Товар"+ ?(ВидОперации = ПоСкладу, "", ",ЦенаПрод")); // Иначе // ПолучитьОстатки(СписТоваров, 1, ТаблОстатков, ); // ТаблОстатков.Свернуть("Товар,ЦенаПрод", "Количество"); // ТаблОстатков.Сортировать("Товар,ЦенаПрод"); // КонецЕсли; // // ДобТовары.ВыбратьСтроки(); // Пока ДобТовары.ПолучитьСтроку() = 1 Цикл // Если ВидОперации = ПоСкладу Тогда // // сначала поищем товар в табличной части // Поз = 0; // Если ТаблЧасть.НайтиЗначение(ДобТовары.Товар, Поз, "Товар") = 1 Тогда // // изменяем только реальное количество у первой найденной позиции товара // // для любой инвентаризации, так как даже если инвентаризация по рознице, // // то неизвестно, по какой заносить количество. // ТаблЧасть.ПолучитьСтрокуПоНомеру(Поз); // ТаблЧасть.Количество = ТаблЧасть.Количество + ДобТовары.РеалКоличество // // сначала пересчитаем в базовую единицу // * ДобТовары.Единица.Коэффициент // // в табличной части может быть и не базовая единица // / ?(ПустоеЗначение(ТаблЧасть.Единица.Коэффициент) = 1, // 1, ТаблЧасть.Единица.Коэффициент); // ТаблЧасть.Сумма = ТаблЧасть.Количество * ТаблЧасть.Цена; // Иначе // ТаблЧасть.НоваяСтрока(); // ТаблЧасть.Товар = ДобТовары.Товар; // ТаблЧасть.Единица = ДобТовары.Товар.БазоваяЕдиница; // ТаблЧасть.Коэффициент = 1; // ТаблЧасть.Количество = ДобТовары.РеалКоличество * ДобТовары.Единица.Коэффициент; // // // получим из регистра реальное учетное количество // Поз = 0; // Если ТаблОстатков.НайтиЗначение(ДобТовары.Товар, Поз, "Товар") = 1 Тогда // ТаблЧасть.КоличествоУчет = ТаблОстатков.ПолучитьЗначение(Поз, "Количество"); // Иначе // ТаблЧасть.КоличествоУчет = 0; // КонецЕсли; // // НомСтр = 0; // Если ТаблСуммы.НайтиЗначение(ДобТовары.Товар, НомСтр, "Товар") = 1 Тогда // ТаблСуммы.ПолучитьСтрокуПоНомеру(НомСтр); // Если ТаблСуммы.Количество = 0 Тогда // ТаблЧасть.СуммаУчет = 0; // ТаблЧасть.Цена = 0; // ТаблЧасть.Сумма = 0; // Иначе // ТаблЧасть.Цена = глПересчет(ТаблСуммы.СуммаБезНДС / ТаблСуммы.Количество, глРубли, 1, Валюта, Курс); // ТаблЧасть.СуммаУчет = ТаблЧасть.Цена * ТаблЧасть.КоличествоУчет; // ТаблЧасть.Сумма = ТаблЧасть.Цена * ТаблЧасть.Количество; // КонецЕсли; // КонецЕсли; // // КонецЕсли; // Если ТаблЧасть.НайтиЗначение(ДобТовары.Товар, Поз, "Товар") = 1 Тогда // // Иначе // Если ВидОперации = ПоСкладу Тогда // // // По рознице // // // распределяем остатки по ценам // // ТермОстаток = ДобТовары.РеалКоличество * ДобТовары.Единица.Коэффициент; // // Если ТермОстаток > 0 Тогда // // не обрабатываем нулевые количества // // Поз = 0; // Если ТаблЧасть.НайтиЗначение(ДобТовары.Товар, Поз, "Товар") = 0 Тогда // // товар в табличной части не нашли // // добавим в табличную часть данные по остаткам из остатков // // ПозОст = 0; // Если ТаблОстатков.НайтиЗначение(ДобТовары.Товар, ПозОст, "Товар") = 1 Тогда // // // установим позициют, начиная с которой будем распределять количество из терминала // Поз = ТаблЧасть.КоличествоСтрок() + 1; // // Для Счетчик = ПозОст По ТаблОстатков.КоличествоСтрок() Цикл // ТаблОстатков.ПолучитьСтрокуПоНомеру(Счетчик); // Если ТаблОстатков.Товар <> ДобТовары.Товар Тогда // // начались остатки другого товара // Прервать; // КонецЕсли; // // ТаблЧасть.НоваяСтрока(); // ТаблЧасть.Товар = ТаблОстатков.Товар; // ТаблЧасть.Единица = ТаблОстатков.Товар.БазоваяЕдиница; // ТаблЧасть.Коэффициент = ТаблЧасть.Единица.Коэффициент; // ТаблЧасть.Цена = ТаблОстатков.ЦенаПрод; // ТаблЧасть.КоличествоУчет = ТаблОстатков.Количество; // ТаблЧасть.СуммаУчет = ТаблОстатков.Количество * ТаблЧасть.Цена; // КонецЦикла; // КонецЕсли; // // КонецЕсли; // // // Если Поз > 0 Тогда // КонПоз = Поз; // последняя строка с текущим товаром // Для Сч = Поз По ТаблЧасть.КоличествоСтрок() Цикл // ТаблЧасть.ПолучитьСтрокуПоНомеру(Сч); // // Если ТермОстаток <= 0 Тогда // // закончился реальный остаток // Прервать; // КонецЕсли; // // Если ТаблЧасть.Товар <> ДобТовары.Товар Тогда // // началась другая позиция номенклатуры // Прервать; // КонецЕсли; // // // пересчитаем остаток количества из терминала в единицу из табличной части // ВремОстаток = ТермОстаток / ?(ПустоеЗначение(ТаблЧасть.Коэффициент) = 1, 1, ТаблЧасть.Коэффициент); // // // добаляемое количество - это минимум между остком количества из терминала и // // разницей Учетного и Фактического из строки табличной части // ДобКолво = Мин(ТаблЧасть.КоличествоУчет - ТаблЧасть.Количество, ВремОстаток); // // Если ДобКолво > 0 Тогда // // // если есть что добавлять // ТаблЧасть.Количество = ТаблЧасть.Количество + ДобКолво; // // // уменьшаем остаток количества из терминала на добавленное количество // ТермОстаток = ТермОстаток - ДобКолво * ТаблЧасть.Коэффициент; // КонецЕсли; // // ТаблЧасть.Сумма = ТаблЧасть.Цена * ТаблЧасть.Количество; // КонПоз = Сч; // КонецЦикла; // // Если ТермОстаток > 0 Тогда // // Не все количество, полученное из терминала, распределилось. // // Добавим нераспределенное количесво в к фактическому в последнюю строку текущего товара. // ТаблЧасть.ПолучитьСтрокуПоНомеру(КонПоз); // ТаблЧасть.Количество = ТаблЧасть.Количество + ТермОстаток / // ?(ПустоеЗначение(ТаблЧасть.Единица.Коэффициент) = 1, 1, ТаблЧасть.Единица.Коэффициент); // КонецЕсли; // Иначе // // Строки с текущим товаром отсуствовали. Добавим новую строку без учетных характеристик // ТаблЧасть.НоваяСтрока(); // ТаблЧасть.Товар = ДобТовары.Товар; // ТаблЧасть.Единица = ДобТовары.Товар.БазоваяЕдиница; // ТаблЧасть.Коэффициент = ТаблЧасть.Единица.Коэффициент; // ТаблЧасть.Количество = ТермОстаток / ?(ПустоеЗначение(ТаблЧасть.Коэффициент) = 1, 1, ТаблЧасть.Коэффициент); // КонецЕсли; // КонецЕсли; // // КонецЕсли; // Если ВидОперации = ПоСкладу Тогда // // КонецЦикла; // Пока ДобТовары.ПолучитьСтроку() = 1 Цикл // // ТаблЧасть.Сортировать("НомерСтрокиДокумента"); // ЗагрузитьТабличнуюЧасть(ТаблЧасть); // // Если Вопрос("Очистить память терминала сбора данных?", "Да+Нет", 60) = "Да" Тогда // глТерминалОчиститьПамять(); // КонецЕсли; // КонецЕсли; // // Возврат ""; //КонецФункции // ЗаполнитьИзТерминала() //***************************************************************************** // ПоКнопкеЗаполнить() // // Параметры: // Нет. // // Возвращаемое значение: // Нет. // // Вызывается из формул элементов диалога: // Кнопка "Заполнить" // // Описание: // Вызывается по кнопке "Заполнить". // Производит выбор способа заполнения и вызов процедуры заполнения документа // Процедура ПоКнопкеЗаполнить() Перем ТипЗаполнения, ВидЗаполнения; Если Фирма.Выбран() = 0 Тогда Предупреждение("Не указана фирма, заполнение невозможно!", 60); Возврат; КонецЕсли; Если МестоХранения.Выбран() = 0 Тогда Предупреждение("Не указан склад, заполнение невозможно!", 60); Возврат; КонецЕсли; СписокТипов = СоздатьОбъект("СписокЗначений"); СписокТипов.ДобавитьЗначение("Перезаполнить"); Если (КоличествоСтрок() <> 0) Тогда СписокТипов.ДобавитьЗначение("Обновить"); КонецЕсли; //Если глТерминалВключен() = 1 Тогда // СписокТипов.ДобавитьЗначение("Заполнить из терминала"); //КонецЕсли; Если СписокТипов.РазмерСписка() = 1 Тогда ТипЗаполнения = СписокТипов.ПолучитьЗначение(1); Иначе Если СписокТипов.ВыбратьЗначение(ТипЗаполнения, , , 60, 1) <> 1 Тогда Возврат; КонецЕсли; КонецЕсли; ФактРавноУчет="Нет"; Если ТипЗаполнения = "Перезаполнить" Тогда // Спросим приравнять ли факт к учету ФактРавноУчет = Вопрос("Приравнять фактическое количество к учетному?","Да+Нет", 60); КонецЕсли; Результат = ЗаполнениеПоСкладу(ТипЗаполнения); Если ПустоеЗначение(Результат) = 0 Тогда Предупреждение(Результат, 60); КонецЕсли; КонецПроцедуры // ПоКнопкеЗаполнить() |
|||
9
Dolly_EV
20.04.13
✎
15:32
|
на форме есть кнопка "Заполнить", на ней висит Процедура ПоКнопкеЗаполнить()
|
|||
10
Эльниньо
20.04.13
✎
15:46
|
(7) Тогда бухзапрос в ТЗ и сравнить с ТЧ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |