Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по конфигурированию № 1
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Готовимся к сдаче специалистов по платформе 8 > 1С:Специалист по Управлению торговлей 8
ignsv
Вопрос:
В качестве исходной использовать типовую конфигурацию "Управление торговлей для Украины".
Необходимо в докуументе "Поступление товаров, услуг" реализовать возможность получения дополнительной печатной формы: "Оценка потребности". Она должна формироваться при нажатии на "штатную кнопку" "Печать".
Необходимо чтобы возможность формирования этой формы была только у пользователей с определенными на то полномочиями. При этом привязки к определенным ролям быть не должно (создавать новую роль также нельзя).
Печатная форма должна иметь следующий вид:




Форма содержит данные за год (не календарный, а интервал). Правой границей является день, предшествующий дате заводимого документа.
Если отгрузок какого-то наименования было более одной, то информация должна попадать в пункт потребности "постоянная", где указывается средний интервал между отгрузками. Средний интервал определяется как количество дней в году, разделенное на количество документов отгрузки по данному товару.
Если отгрузка была только одна - в графу разовая должна попасть дата отгрузки
Vofka
А откуда информацию для печатной формы брать?
ignsv
Мой вариант решения (естественно неоптимальный):

Док Поступление товаров и Услуг. Модуль Объекта
1.
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт
    СтруктураМакетов = Новый Структура;
    СтруктураМакетов.Вставить("Накладная",       "Приходная накладная");
    СтруктураМакетов.Вставить("Ценники",         "Ценники на товары");
    СтруктураМакетов.Вставить("Этикетки",        "Этикетки");
    СтруктураМакетов.Вставить("СерийныеНомера",  "Список серийных номеров");
    СтруктураМакетов.Вставить("Бланк",           "Бланк товарного наполнения");
    СтруктураМакетов.Вставить("ПриходНаРозничныеСкладыВЦенахАТТ", "Приход на розничные склады в ценах АТТ");
    СтруктураМакетов.Вставить("ЗаписьВRFIDМетки", "Запись в RFID метки");
    //УТ СПЕЦИАЛИСТ +        
    Значение = УправлениеПользователями.ПолучитьЗначениеПраваДляТекущегоПользователя(ПланыВидовХарактеристик.ПраваПользователей.ПечатьУТ_Специалист, Ложь);
    Если Значение.Количество() = 0 Тогда
        ДобавитьУТ = Ложь;
    ИначеЕсли Значение.Количество() > 1 Тогда
        ДобавитьУТ = Истина;
    Иначе
        ДобавитьУТ = Значение[0].Значение;
    КонецЕсли;
    Если ДобавитьУТ Тогда
        СтруктураМакетов.Вставить("УТ_Специалист", "УТ Специалист");
    КонецЕсли;
    //УТ СПЕЦИАЛИСТ -
    Возврат СтруктураМакетов;
КонецФункции // ПолучитьСтруктуруПечатныхФорм()


2. Сама функция печати
//УТСпециалист +
Функция ПечатьУТСпециалист()
    Попытка
        Проверка = Дата(Год(Дата),2,29);
        КолДнейВГоду = 366;
    Исключение
        КолДнейВГоду = 365;
    КонецПопытки;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗакупкиОбороты.Номенклатура.Родитель КАК Группа,
    |    ЗакупкиОбороты.Номенклатура КАК Номенклатура,
    |    ЗакупкиОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |    СУММА(ЗакупкиОбороты.КоличествоОборот) КАК КоличествоОборот,
    |    ЗакупкиОбороты.ДокументЗакупки КАК ДокументЗакупки
    |ИЗ
    |    РегистрНакопления.Закупки.Обороты(
    |            &Д1,
    |            &Д2,
    |            ,
    |            Номенклатура В (&спНоменклатура)
    |                И ХарактеристикаНоменклатуры В (&спХарактеристика)) КАК ЗакупкиОбороты
    |
    |СГРУППИРОВАТЬ ПО
    |    ЗакупкиОбороты.Номенклатура,
    |    ЗакупкиОбороты.ХарактеристикаНоменклатуры,
    |    ЗакупкиОбороты.Номенклатура.Родитель,
    |    ЗакупкиОбороты.ДокументЗакупки
    |ИТОГИ
    |    СУММА(КоличествоОборот),
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДокументЗакупки)
    |ПО
    |    Группа,
    |    Номенклатура,
    |    ХарактеристикаНоменклатуры";
    
    ДатаКон =  Дата - (24*60*60);
    ДатаНач = ДатаКон - (КолДнейВГоду*24*60*60);
    Запрос.УстановитьПараметр("Д1", ДатаНач);    
    Запрос.УстановитьПараметр("Д2", ДатаКон);
    Запрос.УстановитьПараметр("спНоменклатура", Товары.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("спХарактеристика",Товары.ВыгрузитьКолонку("ХарактеристикаНоменклатуры"));
    Результат = Запрос.Выполнить();
    ВыборкаНоменклатураРодитель = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "УТСпециалист";
    Макет       = ПолучитьМакет("УТСпециалист");
    ОбластьНадШапка = Макет.ПолучитьОбласть("НадШапкой");
    ТабДокумент.Вывести(ОбластьНадШапка);
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабДокумент.Вывести(ОбластьШапка);
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрокаРазделитель = Макет.ПолучитьОбласть("СтрокаРазделитель");
    КодЯзыкаПечать = Локализация.ПолучитьЯзыкФормированияПечатныхФорм(УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "РежимФормированияПечатныхФорм"));
    Макет.КодЯзыкаМакета = КодЯзыкаПечать;
    Пока ВыборкаНоменклатураРодитель.Следующий() Цикл
        // Вставить обработку выборки ВыборкаНоменклатураРодитель
         ГруппаВыведена = ЛОЖЬ;
        ВыборкаНоменклатура = ВыборкаНоменклатураРодитель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

        Пока ВыборкаНоменклатура.Следующий() Цикл
            // Вставить обработку выборки ВыборкаНоменклатура
            ВыборкаХарактеристикаНоменклатуры = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           //Если ВыборкаНоменклатура.ДокументЗакупки  > 1 Тогда
           Пока ВыборкаХарактеристикаНоменклатуры.Следующий() Цикл              
               ВыборкаФинал = ВыборкаХарактеристикаНоменклатуры.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               Если ВыборкаФинал.Количество() > 1 Тогда
                   ГОСТ = "";
                   Марка = "";
                   Характеристика = ВыборкаХарактеристикаНоменклатуры.ХарактеристикаНоменклатуры;
                   ПоложениеЗапятой = Найти(Характеристика,",");                
                                   ОбластьСтрока.Параметры.Заполнить(ВыборкаХарактеристикаНоменклатуры);
                   Если ПоложениеЗапятой > 0 Тогда
                       Гост  = СокрЛП(Лев(Характеристика,ПоложениеЗапятой-1));
                       Марка = СокрЛП(Прав(Характеристика,ПоложениеЗапятой));    
                   КонецЕсли;
                    ОбластьСтрока.Параметры.Гост =Гост;
                       ОбластьСтрока.Параметры.Марка =Марка;  
                   Если НЕ ГруппаВыведена Тогда
                       ГруппаВыведена = Истина;
                   Иначе
                       ОбластьСтрока.Параметры.Группа = "";  
                   КонецЕсли;
                   ОбластьСтрока.Параметры.Постоянная = КолДнейВГоду/ВыборкаХарактеристикаНоменклатуры.ДокументЗакупки;
                   ОбластьСтрока.Параметры.Разовая = "";
                   ТабДокумент.Вывести(ОбластьСтрока);
                   //ОбластьСтрока.Об
                   Продолжить;
               КонецЕсли;
               Пока ВыборкаФинал.Следующий() Цикл
                   ГОСТ = "";
                   Марка = "";
                   Характеристика = ВыборкаХарактеристикаНоменклатуры.ХарактеристикаНоменклатуры;
                   Если ПоложениеЗапятой > 0 Тогда
                       Гост  = СокрЛП(Лев(Характеристика,ПоложениеЗапятой-1));
                       Марка = СокрЛП(Прав(Характеристика,ПоложениеЗапятой));    
                   КонецЕсли;
                   ОбластьСтрока.Параметры.Гост  = Гост;
                   ОбластьСтрока.Параметры.Марка = Марка;
                   ОбластьСтрока.Параметры.Заполнить(ВыборкаФинал);
                   Разовая = ВыборкаФинал.ДокументЗакупки.Дата;
                   ОбластьСтрока.Параметры.Разовая = Разовая;
                   ОбластьСтрока.Параметры.Постоянная = "";
                    Если НЕ ГруппаВыведена Тогда
                       ГруппаВыведена = Истина;
                   Иначе
                       ОбластьСтрока.Параметры.Группа = "";  
                   КонецЕсли;
                   ТабДокумент.Вывести(ОбластьСтрока);
               КонецЦикла;
            КонецЦикла;
        КонецЦикла;
       ТабДокумент.Вывести(ОбластьСтрокаРазделитель);    
    КонецЦикла;

    Возврат ТабДокумент;

КонецФункции // ПечатьПоступлениеТоваров()
//УТ_Специалист -


3.
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт
//УТ Специалист
        .....
    ИначеЕсли ИмяМакета = "УТ_Специалист" Тогда
        ТабДокумент = ПечатьУТСпециалист();
    КонецЕсли;


4
ПланыВидовХарактеристик ПраваПользователей
Добавить предопределенный: ПечатьУТ_Специалист – тип булево


Vofka
Т.е. вы эти параметры получали путем парсинга наименования характеристики?
svinuk
ignsv , что смущает на первый взгляд:
1. много кода. Лишнего. Ненужного. Проще в запросе все забабахать. В идеале один запрос и в одном цикле вывод в макет. С запросом получится строк 150 кода
2. По поводу парсинга наименования это не правильно. Характеристики предназначены чтоб ими пользовались. Нужно было в ПВХ СвойстваОбъектов добавить предопределенные элементы ГОСТ и Марка. Потом в Характеристике заполнить эти значения ив печатной форме соединять характеристику с её свойствами(регистром сведений ЗначенияСвойствОбъектов)
3. Печатная форма должна быть внешней. Это довольно таки грубая ошибка. Правим типовую там гдк этого можно нужно избежать
4. Код типа "24*60*60" тоже нельзя писать. Нужно с модуле объявиться переменную. например СУТКИ....и внизу модуля её инициализировать. Сутки = 24 * 60 * 60
5. Не тот регистр взяли. В задаче написано о отгрузках, т.е продажах. Надо было брать регистр ПРОДАЖИ
6. По поводу птички в настройках пользователя. Тоже все не правильно. В процедуре ПЕЧАТЬ достаточно вписать следущий код:

Если НЕ УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), 
                                                                                             "РазрешитьПечатьМоейМегачеткойПечатнойФормы") Тогда
       Возврат Неопределено;
КонецЕсли;

В ТЗ же не писалось что не нужно показывать печатную форму. Просто ограничим доступ к ней и все. Видеть будут все, а печатать смогут только те у кого птичка.

Вродь все.

П.С: на экзамене у Вас бы незачет был. Гарантирую. Сам недавно сдавал и попался как раз этот билет. При менее серьезных ошибках, чем у Вас получил трояк, но сдал. smile.gif

ignsv
Да, согласен с Вами. Как всегда все делалось на "горячую руку". Характеристики - тут сам знал что не правильно так делать )). Нужно будет еще раз все переделать по Вашим замечаниям.
Vofka
А зачем ГОСТ и Марку привязывать к характеристике? Почему к элементу справочника номенклатура не привязать?
svinuk
Vofka , потому, что марка и ГОСТ являются характеристиками номенклатуры. Не корректно привязывать их к номенклатуре по одной простой причине - номенклатура "Лист 35мм" может быть нескольких марок и ГОСТов. И тогда в приходных документах не получится отобразить приход одной и той же номенклатуры но с разными характеристиками. Придется добавлять элемент в справочник номенклатура и задавать ему новые характеристики, что более трудозатратнее и неправильно.
TipsyKID
Попался этот билет - сдал.

Но поставили один минус, причем жирный : ГОСТ и МАРКА это НЕ свойства характеристики номенклатуры. Следует привязывать к номенклатуре как свойство объекта. ( в условии задачи не сказано что предприятие ведет учет по характеристикам т.е. Vofka был прав). А так все что говорил svinuk верно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.