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