// =============================== // ОПИСАНИЕ МОДУЛЬНЫХ ПЕРЕМЕННЫХ
Перем СписокПодбора,СправочникПодбора; // СписокПодбора - список, в который отбираются элементы // (используется для множественных фильтров) // СправочникПодбора - строка - идентификатор справочника, из которого осуществляется отбор // (используется для множественных фильтров)
Перем СписокТоваров; // список товаров для фильтрации
Перем ВидСправочника; // Вид печатаемого справочника (Номенклатура или прайс-лист) // Определяется параметром. По умолчанию - прайс Перем ЗаголовокТаблицы; // Заголовок печатной формы
// =============================== // "СЛУЖЕБНЫЕ" ПРОЦЕДУРЫ И ФУНКЦИИ
// =============================== // ПРОЦЕДУРЫ И ФУНКЦИИ, ВЫЗЫВАЕМЫЕ ИЗ ФОРМУЛ ЭЛЕМЕНТОВ ДИАЛОГА
// =============================== // Название: Сдвиг // Параметры: // Режим - строка: "Вверх" или "Вниз",- определяющая направление сдвига // Список - список, в котором происходит сдвиг // Возвращаемое значение: // НЕТ // Вызывается из формул элементов диалога: // кнопки со стрелками вверх и вниз // Наименование,. // Описание: // сдвигает текущую позицию в списке на 1 элемент вниз или вверх // Процедура Сдвиг(Режим,Список) Перем ТекущПредставление; Перем СледующПредставление;
ТекущаяСтрока=Список.ТекущаяСтрока(); Если ТекущаяСтрока<=0 Тогда Возврат; КонецЕсли;
Если Режим="Вверх" Тогда Если ТекущаяСтрока=1 Тогда СледующСтрока=Список.РазмерСписка(); Иначе СледующСтрока=ТекущаяСтрока-1; КонецЕсли; ИначеЕсли Режим="Вниз" Тогда Если ТекущаяСтрока=Список.РазмерСписка() Тогда СледующСтрока=1; Иначе СледующСтрока=ТекущаяСтрока+1; КонецЕсли; Иначе Возврат; КонецЕсли;
// =============================== // Название: РаботаСоСписком // Параметры: // Режим - строка, принимающая 4 значения: // "Добавить" // "ДобавитьНесколько" // "Удалить" // "УдалитьВсе" // Список - список значений, в котором задается множественный фильтр // ТипСправочника - строка, содержащая идентификатор справочнника, по // которому осуществляется мноджественный фильтр // Возвращаемое значение: // НЕТ // Вызывается из формул элементов диалога: // кнопок работы с множественными фильтрами ("...",".....","X","XX") // Наименование,. // Описание: // процедура предназначена для добавления и удаления элементов // из множественных фильтров Процедура РаботаСоСписком(Режим,Список,ТипСправочника) Перем ТекПоз; Перем ТекЭлемент; Перем Фрм;
Если ТипСправочника = "Категории" Тогда ТипСправочника = "ВидыКатегории"; КонецЕсли;
ТекПоз = Список.ТекущаяСтрока(); Если ТекПоз>0 Тогда ТекЭлемент=Список.ПолучитьЗначение(ТекПоз); КонецЕсли;
Если Режим="Добавить" Тогда // добавляем в список один элемент СписокПодбора = Список; СправочникПодбора = ВРег(ТипСправочника); // открываем окно подбора ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,0,ТекЭлемент); Фрм.ВыборГруппы(1);
ИначеЕсли Режим="ДобавитьНесколько" Тогда // добавляем в список несколько элементов СписокПодбора = Список; СправочникПодбора = ВРег(ТипСправочника); // открываем окно подбора ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,1,ТекЭлемент); Фрм.ВыборГруппы(1);
ИначеЕсли Режим="УдалитьВсе" Тогда // удаляем все элементы из списка Список.УдалитьВсе();
ИначеЕсли Режим="Удалить" Тогда // удаляем из списка один элемент Если ТекПоз>0 Тогда Список.УдалитьЗначение(ТекПоз); КонецЕсли; КонецЕсли;
КонецПроцедуры // работа со списком
// =============================== // Название: Выполнить // Параметры: // НЕТ // Возвращаемое значение: // НЕТ // Вызывается из формул элементов диалога: // Кнопки "Печать" // Описание: // выполняет печать прайс-листа // Процедура Печать() Перем СписокПозиций, СписокТоваров;
// накладываем множественный фильтр по товарам Если МФНоменклатура.РазмерСписка()<>0 Тогда
Для Индекс=1 По МФНоменклатура.РазмерСписка() Цикл Позиция = МФНоменклатура.ПолучитьЗначение(Индекс);
НоменкВложенаВДругую=0; Для Индекс2=1 По МФНоменклатура.РазмерСписка() Цикл Если Индекс2<>Индекс Тогда Позиция2 = МФНоменклатура.ПолучитьЗначение(Индекс2); Если Позиция2.ЭтоГруппа()>0 Тогда Если Позиция.ПринадлежитГруппе(Позиция2)>0 Тогда НоменкВложенаВДругую=1; Прервать; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
Если НоменкВложенаВДругую=1 Тогда Продолжить; КонецЕсли;
Если Позиция.ЭтоГруппа()>0 Тогда СпрПозиций = СоздатьОбъект("Справочник."+ВидСправочника); СпрПозиций.ИспользоватьРодителя(Позиция.ТекущийЭлемент()); СпрПозиций.ВыбратьЭлементы(1); Пока СпрПозиций.ПолучитьЭлемент()>0 Цикл Если СпрПозиций.ЭтоГруппа()=0 Тогда СписокПозиций.ДобавитьЗначение(СпрПозиций.ТекущийЭлемент()); Если Нрег(ВидСправочника) = "прайс_лист" Тогда СписокТоваров.ДобавитьЗначение(СпрПозиций.Товар.ТекущийЭлемент()); Иначе СписокТоваров.ДобавитьЗначение(СпрПозиций.ТекущийЭлемент()); КонецЕсли; КонецЕсли; КонецЦикла; Иначе СписокПозиций.ДобавитьЗначение(Позиция.ТекущийЭлемент()); Если Нрег(ВидСправочника) = "прайс_лист" Тогда СписокТоваров.ДобавитьЗначение(Позиция.Товар.ТекущийЭлемент()); Иначе СписокТоваров.ДобавитьЗначение(Позиция.ТекущийЭлемент()); КонецЕсли; КонецЕсли;
КонецЦикла;
Если СписокПозиций.РазмерСписка()=0 Тогда Предупреждение("Список позиций пуст"); Возврат; КонецЕсли;
НаложенФильтрПоТоварам=1; КонецЕсли;
// не включать отсутствующие Если ТолькоПрисутствующие<>0 Тогда
ВремРегистры=СоздатьОбъект("Регистры"); Рег=ВремРегистры.ОстаткиТоваров; Если РабочаяДата()<ПолучитьДатуТА() Тогда Рег.ВременныйРасчет(); Если НаложенФильтрПоТоварам=1 Тогда Рег.УстановитьЗначениеФильтра("Товар",СписокТоваров,2); КонецЕсли; Рег.УстановитьЗначениеФильтра("Фирма",ВыбФирма); ВремРегистры.РассчитатьРегистрыПО(РабочаяДата()); КонецЕсли;
Если НаложенФильтрПоТоварам=1 Тогда
ЧислоТов = СписокПозиций.РазмерСписка(); Для Индекс = 1 По ЧислоТов Цикл
// накладываем фильтр по присутствию/отсутствию Если Номенк.ВидТМЦ<>Перечисление.ВидыТМЦ.Товар Тогда НеУдовлетвФильтру=1; Иначе Кол = ВремРегистры.ОстаткиТоваров.СводныйОстаток(ВыбФирма,Номенк,,,,"ОстатокТовара"); Если Кол<=0 Тогда НеУдовлетвФильтру=1; КонецЕсли; КонецЕсли;
Если НеУдовлетвФильтру=1 Тогда СписокПозиций.УдалитьЗначение(ЧислоТов+1-Индекс); КонецЕсли; КонецЦикла;
Иначе
СпрПозиций = СоздатьОбъект("Справочник."+ВидСправочника); СпрПозиций.ВыбратьЭлементы(); Пока СпрПозиций.ПолучитьЭлемент()>0 Цикл Если СпрПозиций.ЭтоГруппа()=0 Тогда Если Нрег(ВидСправочника) = "прайс_лист" Тогда Номенк = СпрПозиций.Товар.ТекущийЭлемент(); Иначе Номенк = СпрПозиций.ТекущийЭлемент(); КонецЕсли;
Если Номенк.ВидТМЦ=Перечисление.ВидыТМЦ.Товар Тогда Кол = ВремРегистры.ОстаткиТоваров.СводныйОстаток(ВыбФирма,Номенк.ТекущийЭлемент(),,,,,"ОстатокТовара"); Если Кол>0 Тогда СписокПозиций.ДобавитьЗначение(СпрПозиций.ТекущийЭлемент()); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
КонецЕсли;
Если СписокПозиций.РазмерСписка()=0 Тогда Предупреждение("Список позиций пуст"); Возврат; КонецЕсли;
НаложенФильтрПоТоварам=1;
КонецЕсли;
Если МФКатНоменклатуры.РазмерСписка() > 0 Тогда
ТекстЗапроса = " |Обрабатывать НеПомеченныеНаУдаление; |КатегорияПозиции = Справочник.КатегорииТоваров.ТекущийЭлемент; |Товар = Справочник.КатегорииТоваров.Владелец; |КатегорияТов = Справочник.КатегорииТоваров.Категория; |Группировка Товар Без Групп; |Группировка КатегорияТов Без Групп; |Условие (КатегорияТов В МФКатНоменклатуры); |Условие (Товар В СписокТоваров);";
// выполняем запрос Запрос = СоздатьОбъект("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Возврат; КонецЕсли;
// выгружаем все отобранные товары в список Запрос.ВНачалоВыборки(); Пока Запрос.Группировка("Товар") = 1 Цикл Если Запрос.Товар.Выбран() = 1 Тогда Если ТипМФКатНоменклатуры.ТекущаяСтрока() = 2 Тогда // одновременно все категории должны быть в списке МФКатегории
// ячитаем число категорий ЧислоКатегорий = 0; Пока Запрос.Группировка("КатегорияТов") = 1 Цикл Если Запрос.КатегорияТов.Выбран() = 1 Тогда ЧислоКатегорий = ЧислоКатегорий + 1; КонецЕсли; КонецЦикла;
// все категории будут тогда и только тогда, когда число отобранных // категорий будет не меньше размера списка МФКатегории Если ЧислоКатегорий >= ЧислоКатегорийВСписке Тогда СписокТоваров.ДобавитьЗначение(ПозицияСправочника.ТекущийЭлемент()); КонецЕсли; Иначе СписокТоваров.ДобавитьЗначение(Запрос.Товар.ТекущийЭлемент()); КонецЕсли; КонецЕсли; КонецЦикла;
Если НаложенФильтрПоТоварам = 1 Тогда
РазмерСпискаПозиций = СписокПозиций.РазмерСписка(); Для Индекс = 1 по РазмерСпискаПозиций Цикл Если СписокТоваров.Принадлежит(?(НРег(ВидСправочника) = "прайс_лист", СписокПозиций.ПолучитьЗначение(РазмерСпискаПозиций - Индекс + 1).Товар, СписокПозиций.ПолучитьЗначение(РазмерСпискаПозиций - Индекс + 1))) = 0 Тогда СписокПозиций.УдалитьЗначение(РазмерСпискаПозиций - Индекс + 1); КонецЕсли; КонецЦикла;
Иначе
СпрПозиций = СоздатьОбъект("Справочник." + ВидСправочника); СпрПозиций.ВыбратьЭлементы(); Пока СпрПозиций.ПолучитьЭлемент() = 1 Цикл Если СпрПозиций.ЭтоГруппа() = 0 Тогда Если СписокТоваров.Принадлежит(?(НРег(ВидСправочника) = "прайс_лист", СпрПозиций.ТекущийЭлемент().Товар, СпрПозиций.ТекущийЭлемент())) = 1 Тогда СписокПозиций.ДобавитьЗначение(?(НРег(ВидСправочника) = "прайс_лист", СпрПозиций.ТекущийЭлемент(), СпрПозиций.Товар.ТекущийЭлемент())); КонецЕсли; КонецЕсли; КонецЦикла;
КонецЕсли;
Если СписокПозиций.РазмерСписка() = 0 Тогда Предупреждение("Список позиций пуст"); Возврат; КонецЕсли;
КонецЕсли;
// теперь отбираем позиции справочника Если Нрег(ВидСправочника) = "прайс_лист" Тогда ТекстЗапроса = " |Период С '"+Строка(Мин(РабочаяДата(),ПолучитьДатуТА()))+"' По '"+Строка(Мин(РабочаяДата(),ПолучитьДатуТА()))+"'; |Позиция = Справочник.Прайс_лист.ТекущийЭлемент; |Товар = Справочник.Прайс_лист.Товар; |Группировка Позиция; |Условие (Позиция В СписокПозиций); |"; ИначеЕсли Нрег(ВидСправочника) = "тмц" Тогда ТекстЗапроса = " |Период С '"+Строка(Мин(РабочаяДата(),ПолучитьДатуТА()))+"' По '"+Строка(Мин(РабочаяДата(),ПолучитьДатуТА()))+"'; |Позиция = Справочник.ТМЦ.ТекущийЭлемент; |Товар = Справочник.ТМЦ.ТекущийЭлемент; |Группировка Позиция; |Условие (Позиция В СписокПозиций); |"; КонецЕсли;
// выполняем запрос Запрос = СоздатьОбъект("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Возврат; КонецЕсли;
// Создание Таблицы для выходного отчета Таб=СоздатьОбъект("Таблица");
Ном=0;
Если (ЕдиницаПечати.ТекущаяСтрока()<>1)И(ЕдиницаПечати.ТекущаяСтрока()<>2) Тогда ПечатьВФиксЕдиницах = 0; Иначе ПечатьВФиксЕдиницах = 1; КонецЕсли;
Если ВалютаПечати.Выбран()=0 Тогда ПечатьВФиксВалюте = 0; Заг=""; Иначе ПечатьВФиксВалюте = 1; Валюта = ВалютаПечати; Заг="Цены указаны в "+СокрЛП(Валюта.Кратко); КонецЕсли;
Таб.ВывестиСекцию("Отчет"); Таб.ВывестиСекцию("Шапка|НазваниеПозиции"); Для Индекс = 1 По МФКатЦены.РазмерСписка() Цикл ТипЦены = МФКатЦены.ПолучитьЗначение(Индекс); Таб.ПрисоединитьСекцию("Шапка|Цена"); КонецЦикла;
Если Нрег(ВидСправочника) = "прайс_лист" Тогда НашлиНенулевуюЦену=0;
Для Индекс = 1 По МФКатЦены.РазмерСписка() Цикл ТипЦены = МФКатЦены.ПолучитьЗначение(Индекс).ТекущийЭлемент(); Если Цена.НайтиПоРеквизиту("КатегорияЦены",ТипЦены,0)<=0 Тогда Продолжить; КонецЕсли; Если Цена.Цена=0 Тогда Продолжить; КонецЕсли; НашлиНенулевуюЦену=1; Прервать; КонецЦикла;
Если НашлиНенулевуюЦену=0 Тогда Продолжить; КонецЕсли; КонецЕсли;
Пока СписокГрупп.РазмерСписка()>0 Цикл Гр = СписокГрупп.ПолучитьЗначение(1); Если Запрос.Позиция.ПринадлежитГруппе(Гр)>0 Тогда Если Гр.Уровень()=1 Тогда Таб.ВывестиСекцию("Группа1|НазваниеПозиции"); ИначеЕсли Гр.Уровень()=2 Тогда Таб.ВывестиСекцию("Группа2|НазваниеПозиции"); Иначе Таб.ВывестиСекцию("Группа3|НазваниеПозиции"); КонецЕсли; КонецЕсли; СписокГрупп.УдалитьЗначение(1); КонецЦикла;
Если ПечатьВФиксЕдиницах=1 Тогда Если ЕдиницаПечати.ТекущаяСтрока()=1 Тогда Единица = Запрос.Товар.ЕдиницаПоУмолчанию; ИначеЕсли ЕдиницаПечати.ТекущаяСтрока()=2 Тогда Единица = глВернутьБазовуюЕдиницуТовара(Запрос.Товар.ТекущийЭлемент()); КонецЕсли; КонецЕсли;
Для Индекс = 1 По МФКатЦены.РазмерСписка() Цикл ТипЦены = МФКатЦены.ПолучитьЗначение(Индекс).ТекущийЭлемент(); Если Цена.НайтиПоРеквизиту("КатегорияЦены",ТипЦены,0)<=0 Тогда ПечЦена = ""; Иначе
Если ПечатьВФиксВалюте=0 Тогда Валюта = Цена.Валюта; КонецЕсли;
Если ПечатьВФиксЕдиницах=0 Тогда Единица = Цена.Единица; КонецЕсли;
// =============================== Процедура ПриОткрытии() // Предопределенная процедура // Определяем какой спрвочник печатается Если ПустоеЗначение(Форма.Параметр) = 1 Тогда ВидСправочника = "Прайс_лист"; Иначе ВидСправочника = СокрЛП(Форма.Параметр); КонецЕсли;
ВыбФирма = глВосстановитьЗначение(,"БазФирма");
Если Нрег(ВидСправочника) = "прайс_лист" Тогда Форма.ПозицииТекст.Заголовок("Позиции и группы прайс-листа:"); ЗаголовокТаблицы = "Прайс-лист"; Форма.Заголовок("Печать прайс-листа"); ИначеЕсли Нрег(ВидСправочника) = "тмц" Тогда Форма.ПозицииТекст.Заголовок("Позиции и группы номенклатуры:"); ЗаголовокТаблицы = "Каталог товаров"; Форма.Заголовок("Печать каталога товаров"); Иначе Предупреждение("Обработка вызвана с неверным параметром."); СтатусВозврата(0); Возврат; КонецЕсли;
Если (ВРег(Значение.Вид())=СправочникПодбора)И(СписокПодбора.НайтиЗначение(Значение)=0) Тогда ПредставлениеЗначения = Строка(Значение); Если СправочникПодбора="ПРАЙС_ЛИСТ" Тогда Если (Значение.ЭтоГруппа()=0)И(Значение.Товар.Выбран()>0) Тогда ПредставлениеЗначения = Строка(Значение.Товар); КонецЕсли; КонецЕсли; СписокПодбора.ДобавитьЗначение(Значение,ПредставлениеЗначения); СписокПодбора.ТекущаяСтрока(СписокПодбора.РазмерСписка()); КонецЕсли; КонецПроцедуры // ОбработкаПодбора
МФКатЦены.УдалитьВсе(); ВсеЦены = СоздатьОбъект("Справочник.КатегорииЦен"); ВсеЦены.ВыбратьЭлементы(); Пока ВсеЦены.ПолучитьЭлемент()>0 Цикл МФКатЦены.ДобавитьЗначение(ВсеЦены.ТекущийЭлемент()); КонецЦикла;
Я вообще нуб в 1с знаком неделю, выше код формы печать прайса, мне нужно добавить остатки в колонку. и возможность его экспорта в формате csv.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!