"Печать этикеток из поступления только отмеченной номенклатуры"
Опубликовано Вс 23 Сентябрь 2012 в misc
Теги: Практика программирования 1С, Табличная часть, МВТ, Запрос,
В чем соль?
Реквизит в табличную часть документа добавлять нельзя, так как установка флажка изменяет табличную часть, то форма получает признак модифицированности и постоянные вопросы о необходимости сохранять документ, немного нервируют пользователя(а если документ большой и проведенный, то процедура сохранения, еще и какое то время занимает) в целом это можно было бы и пережить(можно и признак модифицированности скидывать), но клиент мириться с этим не захотел, а так как если при печати все равно придется анализировать табличное поле, было решено сделать колонку не связанную с данными табличной части. В результате анализа ситуации стало ясно следующее:
- Если данные не хранятся в табличной части, то придется самому позаботится о том где мы будеи держать информацию об отмеченных строках.
- Механизм отрисовки флажка тоже придется взять на себя.
Как обычно прежде чем начинать городить велосипед, был сделан запрос к базе знаний и выяснено следующее: для моего случая уже есть описанный случай на ИТС и называется он Реализация отметки строк флажками в табличном поле
. Раз есть готовый код, то берем его, модифицируем, используем. Итак поехали:
Реализация отметок в табличном поле
Для начала, надо добавить колонку в табличное поле и нужно указать, что элемент управления - флажок, ну и название придумать какое нибудь. Теперь надо позаботится об объекте где будут храниться данные об наших отметках. Это будет переменная и называться она будет СписокОтметок
, так и объявим в начале модуля:
Перем СписокОтметок;
в конце где выполняется код при открытии модуля (если не понимаете о чем я просто поставьте самой последней строкой) укажем тип нашей переменной: СписокОтметок = Новый Соответствие.
Теперь надо организовать изменение этого списка, когда пользователь щелкает по флажку в табличной части, для этого подойдет событие табличного поля ПриИзмененииФлажка
, в нем нам надо указать следующее:
Процедура ТоварыПриИзмененииФлажка(Элемент, Колонка)
Если Колонка.Имя = "Отметка" Тогда
Если СписокОтметок[Элемент.ТекущаяСтрока] = Неопределено Тогда
СписокОтметок[Элемент.ТекущаяСтрока] = Истина;
Иначе
СписокОтметок.Удалить(Элемент.ТекущаяСтрока);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Что здесь происходит: когда пользователь щелкает по флажку, процедура ищет нужную строку табличной части и если ее нет, то добавляет, если есть удалет, таким образом, осуществляя изменение состояния флажка.
Теперь нужно организовать вывод флажков в табличное поле, на текущий момент юзер не видит установленных флажков в табличном поле. Для работы с выводом, нужно использовать событие ПриВыводеСтроки
вот такой код используется для вывода флажка:
ОформлениеСтроки.Ячейки.Отметка.ОтображатьФлажок = Истина;
Если СписокОтметок[ДанныеСтроки] = Неопределено Тогда
ОформлениеСтроки.Ячейки.Отметка.Флажок = Ложь;
Иначе
ОформлениеСтроки.Ячейки.Отметка.Флажок = Истина;
КонецЕсли;
Тут все тоже очень просто: если текущая строка есть в списке отметок мы ее отметим если нету, не будем. Таким образом у нас есть список тех строк табличной части документов, которые были отмечены.
Передача отмеченных строк в обработку печати этикеток.
Для того, что бы передать список номенклатуры, в обработку печати этикеток, я нашел два варианта, это передать ссылку на группу или ссылку на номенклатуру. Или что бы со списком было бы еще количество, можно передать ссылку на документ. Нам не подходит не первое, не второе. Так как нам нужно и количество и определенный список. Поэтому я немного переделал процедуру печати этикеток НапечататьЭтикеткиИзДокумента
, которая формирует из ссылки на табличную часть документа, таблицу товары, которую принимает обработка печати этикеток. Для начала я выгрузил в таблицу значений отмеченные значения, загрузил ее во временную таблицу в запросе.
МВТ = Новый МенеджерВременныхТаблиц;
ТаблицаИзДока = Новый Запрос;
ТаблицаИзДока.МенеджерВременныхТаблиц = МВТ;
ТаблицаИзДока.Текст =
"Выбрать
|Таблица.Номенклатура,
|Таблица.Количество,
|Таблица.ЕдиницаИзмерения,
|ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
|ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка) КАК Серия,
|ЗНАЧЕНИЕ(Справочник.Качество.Новый) КАК Качество,
|0 КАК Цена
|ПОМЕСТИТЬ ТаблицаИЗДока
|ИЗ
|&ТаблицаСДанными КАК Таблица";
ТаблицаИзДока.УстановитьПараметр("ТаблицаСДанными", ТабличкаИЗДокумента);
ТаблицаИзДока.Выполнить();
Полученную временную таблицу я передал в запрос, выбирающий данные из регистра штрихкодов:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Номенклатура КАК Номенклатура,
| Док.Количество КАК Количество,
| Док.Характеристика КАК Характеристика,
| Док.Серия КАК Серия,
| Док.Качество КАК Качество,
| Док.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Док.Цена КАК Цена,
| РегШК.ТипШтрихкода КАК ТипШтрихкода,
| РегШК.Штрихкод КАК Штрихкод
|ИЗ
| ТаблицаИЗДока КАК Док
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК РегШК
| ПО (РегШК.Владелец = Док.Номенклатура)
| И (РегШК.ЕдиницаИзмерения = Док.ЕдиницаИзмерения)
| И (РегШК.ХарактеристикаНоменклатуры = Док.Характеристика)
| И (РегШК.СерияНоменклатуры = Док.Серия)
| И (РегШК.Качество = Док.Качество)";
после этого остается только напечатать этикетки
ЗаполнениеДокументов.ПечатьЭтикеток(Запрос.Выполнить().Выгрузить());