Имя: Пароль:
1C
1С v8
Справедлива ли оценка выполнения тестового задания?
0 lenkavovka
 
20.02.23
13:20
Делал тестовое на вакансию разработчика. Формат работодателя - дочерняя ИТ-компания, обслуживающая основную. Зарплата по нижней границе рынка.
Задача выглядела так, без каких-либо дополнительных пожеланий:

Написать внешнюю обработку для УТ 11, КА 1.1, ЕРП (любой версии):
В обработке пользователь выбирает группу номенклатуры, организацию и период.
За указанный период обработка ищет всех контрагентов, которым продавались позиции номенклатуры из указанной папки за указанный период по указанной организации.
По кнопке «Выполнить» заполняется таблица (в обработке) со следующими колонками:
Контрагент – контрагент,
Юр. адрес – юридический адрес контрагента,
Количество номенклатуры – количество всей проданной номенклатуры (без разбивки по позициям, в единицах хранения),
Сумма продажи.
Пользователь может отметить галочками необходимые строки, и по кнопке «Печать» - вывести простую печатную форму в виде таблицы с этими колонками (плюс колонка №).

Сделал, максимально быстро и компактно. Выборку выгружаем сразу в ТЗ на форме, по кнопке копируем отмеченные галочками строки в отдельную ТЗ, где нумеруем строки и на печать через построитель отчёта, поскольку просили простую форму. Внезапно получаем разгромный отзыв. Теперь гадаю, действительно ли моё решение недостойно? Отписал конечно эйчару предложение указывать в задании требование использовать БСП и макеты, если они ожидают их получить. Обещала донести до руководителя.
П.С.: меня не печалит сам отказ, поскольку получил уже более достойные предложение работодателей. Смущает сама оценка.
Сам ответ:

Задание показывает верный результат, но выполнено с ошибками методологическими и техническими.
Используется довольно устаревший метод через построитель запроса, никак не участвует макет, нет использования БСП при выводе, в запросе проблемы с оптимизацией.

Моё решение:

&НаСервере
Процедура ВыполнитьНаСервере()
                  
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    КлючиАналитикиУчетаПоПартнерам.Ссылка КАК Ссылка,
                          |    КлючиАналитикиУчетаПоПартнерам.Контрагент КАК Контрагент
                          |ПОМЕСТИТЬ ВТ_КлючиАналитикиУчетаПоПартнерам
                          |ИЗ
                          |    Справочник.КлючиАналитикиУчетаПоПартнерам КАК КлючиАналитикиУчетаПоПартнерам
                          |ГДЕ
                          |    КлючиАналитикиУчетаПоПартнерам.Организация = &Организация
                          |    И НЕ КлючиАналитикиУчетаПоПартнерам.ПометкаУдаления
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |    //++-- по рекомендациям 1С разбиваем запрос ключей аналитики номенклатуры на отдельные, чтобы исключить соединение через две точки
                          |ВЫБРАТЬ
                          |    Номенклатура.Ссылка КАК Ссылка
                          |ПОМЕСТИТЬ ВТ_Номенклатура
                          |ИЗ
                          |    Справочник.Номенклатура КАК Номенклатура
                          |ГДЕ
                          |    Номенклатура.Ссылка В ИЕРАРХИИ(&ОтборНоменклатуры)
                          |    И НЕ Номенклатура.ПометкаУдаления
                          |    И НЕ Номенклатура.ЭтоГруппа
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    КлючиАналитикиУчетаНоменклатуры.Ссылка КАК Ссылка
                          |ПОМЕСТИТЬ ВТ_КлючиАналитикиУчетаНоменклатуры
                          |ИЗ
                          |    ВТ_Номенклатура КАК ВТ_Номенклатура
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КлючиАналитикиУчетаНоменклатуры КАК КлючиАналитикиУчетаНоменклатуры
                          |        ПО ВТ_Номенклатура.Ссылка = КлючиАналитикиУчетаНоменклатуры.Номенклатура
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    ВТ_КлючиАналитикиУчетаПоПартнерам.Контрагент КАК Контрагент,
                          |    СУММА(ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот) КАК КоличествоОборот,
                          |    СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК СуммаВыручкиОборот
                          |ПОМЕСТИТЬ ВТ_Продажи
                          |ИЗ
                          |    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, , ) КАК ВыручкаИСебестоимостьПродажОбороты
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КлючиАналитикиУчетаПоПартнерам КАК ВТ_КлючиАналитикиУчетаПоПартнерам
                          |        ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам = ВТ_КлючиАналитикиУчетаПоПартнерам.Ссылка
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КлючиАналитикиУчетаНоменклатуры КАК ВТ_КлючиАналитикиУчетаНоменклатуры
                          |        ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры = ВТ_КлючиАналитикиУчетаНоменклатуры.Ссылка
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    ВТ_КлючиАналитикиУчетаПоПартнерам.Контрагент
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |    //++-- будем выбирать номер строки самого свежего юр. адреса, чтобы не размножить выборку продаж    
                          |ВЫБРАТЬ
                          |    КонтрагентыКонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
                          |    КонтрагентыКонтактнаяИнформация.Представление КАК ЮрАдрес,
                          |    ВТ_Продажи.Контрагент КАК Контрагент
                          |ПОМЕСТИТЬ ВТ_МассивАдресовКонтрагентов
                          |ИЗ
                          |    ВТ_Продажи КАК ВТ_Продажи
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
                          |        ПО ВТ_Продажи.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка
                          |            И (КонтрагентыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента))
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    МАКСИМУМ(ВТ_МассивАдресовКонтрагентов.НомерСтроки) КАК НомерСтроки,
                          |    ВТ_МассивАдресовКонтрагентов.Контрагент КАК Контрагент
                          |ПОМЕСТИТЬ ВТ_МаксимальныеНомераСтрокАдресов
                          |ИЗ
                          |    ВТ_МассивАдресовКонтрагентов КАК ВТ_МассивАдресовКонтрагентов
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    ВТ_МассивАдресовКонтрагентов.Контрагент
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    ВТ_МаксимальныеНомераСтрокАдресов.Контрагент КАК Контрагент,
                          |    ВТ_МассивАдресовКонтрагентов.ЮрАдрес КАК ЮрАдрес
                          |ПОМЕСТИТЬ ВТ_АдресаКонтрагентов
                          |ИЗ
                          |    ВТ_МассивАдресовКонтрагентов КАК ВТ_МассивАдресовКонтрагентов
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_МаксимальныеНомераСтрокАдресов КАК ВТ_МаксимальныеНомераСтрокАдресов
                          |        ПО ВТ_МассивАдресовКонтрагентов.Контрагент = ВТ_МаксимальныеНомераСтрокАдресов.Контрагент
                          |            И ВТ_МассивАдресовКонтрагентов.НомерСтроки = ВТ_МаксимальныеНомераСтрокАдресов.НомерСтроки
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    ВТ_Продажи.Контрагент КАК Контрагент,
                          |    ВТ_АдресаКонтрагентов.ЮрАдрес КАК ЮрАдрес,
                          |    ВТ_Продажи.КоличествоОборот КАК КоличествоНоменклатуры,
                          |    ВТ_Продажи.СуммаВыручкиОборот КАК СуммаПродажи
                          |ИЗ
                          |    ВТ_Продажи КАК ВТ_Продажи
                          |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_АдресаКонтрагентов КАК ВТ_АдресаКонтрагентов
                          |        ПО ВТ_Продажи.Контрагент = ВТ_АдресаКонтрагентов.Контрагент");
    Запрос.УстановитьПараметр("НачалоПериода", ПериодОтбора.ДатаНачала);
    Запрос.УстановитьПараметр("ОкончаниеПериода", ПериодОтбора.ДатаОкончания);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("ОтборНоменклатуры", ОтборНоменклатуры);
    
    ТЗ.Очистить();
    ТЗ.Загрузить(Запрос.Выполнить().Выгрузить());
    
КонецПроцедуры


&НаКлиенте
Процедура КомандаВыполнить(Команда)

    Если ПроверитьЗаполнение() Тогда
        ВыполнитьНаСервере();
    КонецЕсли;  
    
КонецПроцедуры


&НаКлиенте
Процедура ПечатьОтмеченных(Команда)      
    
    ТабДок = ПечатьОтмеченныхНаСервере();
    ТабДок.Показать();
    
КонецПроцедуры      


&НаСервере
Функция ПечатьОтмеченныхНаСервере()    
    
    ТЗЗначение = РеквизитФормыВЗначение("ТЗ");
    СтрокиНаПечать = ТЗЗначение.НайтиСтроки(Новый Структура("ОтметкаПечать", Истина));
    ТЗНаПечать = ТЗЗначение.Скопировать(СтрокиНаПечать, "Номер, Контрагент, ЮрАдрес, КоличествоНоменклатуры, СуммаПродажи");
    
    Для Каждого СтрокаТЗ Из ТЗНаПечать Цикл
        СтрокаТЗ.Номер = ТЗНаПечать.Индекс(СтрокаТЗ) + 1;
    КонецЦикла;
    
    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗНаПечать);
        
    ТабДок = Новый ТабличныйДокумент;
    ПостроительОтчета.Вывести(ТабДок);
    Возврат ТабДок;    
    
КонецФункции
1 Жан Пердежон
 
20.02.23
13:26
тебе по делу всё написали
2 Обработка
 
20.02.23
13:26
(0) В топку таких работодателей с такими задачами.
Тупя задача.
3 РусКомп
 
20.02.23
13:26
(0) > Используется довольно устаревший метод через построитель запроса, никак не участвует макет,

Это как? Т.е. надо было текст запроса хранить в макете СКД, а не черным запросом?
4 magicSan
 
20.02.23
13:28
(1) Используется довольно устаревший метод через построитель запроса - давайц свой вариант,
" никак не участвует макет" - он не был задан от того построитель отчета
"нет использования БСП при выводе" - это не ПФ оно и не нужно
5 Жан Пердежон
 
20.02.23
13:28
(3) в макетах еще табличный документ может хранится
(0) самая грубая ошибка - не используешь параметры вирт.таблицы для отбора
6 magicSan
 
20.02.23
13:37
"   Номенклатура.Ссылка В ИЕРАРХИИ(&ОтборНоменклатуры)" - это засада для тех у кого много вложений и товара
7 lenkavovka
 
20.02.23
13:40
(5) А можно подробнее? Это про РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, , )? Чего, на твой взгляд, не хватает, и какой может быть более оптимальный запрос? Не могу понять. Ну и "по делу написали" - тоже без аргументов.
8 1Снеговик
 
гуру
20.02.23
13:43
(0) вангую:
- это должна была быть внешняя обработка с объявлениями команд через БСП, ну короче должна добавляться как внешняя.
- должен был быть макет с заголовком/шапкой/строкой/подвалом, а типа через построитель слишком лениво.
- запрос не оптимален только потому, что забыл индексы. 1с рекомендует всегда индексировать поля соединения во временных таблицах.
Ну и сейчас контактная информация имеет поле "ДействуетС", по которому и нужно было определять актуальные адреса, а не по номеру строки.

В целом, код приемлемый. Я бы тебя на работу взял :)
9 1ctube
 
20.02.23
13:44
(6) "Номенклатура.Ссылка В ИЕРАРХИИ(&ОтборНоменклатуры)" - это засада для тех у кого много вложений и товара"

Почему?
10 lenkavovka
 
20.02.23
13:45
(3) Мне самому, если честно, кажется, что проверяющий хотел видеть использование макета печатной формы. Но забыл это обозначить в условии. И вместо запроса, который может быть сложен в понимании, хотел увидеть набор вызовов стандартных функций в коде. И это тоже забыл обозначить.
11 Обработка
 
20.02.23
13:47
(10) И сколько время дали на выполнение этой задачи?
12 H A D G E H O G s
 
20.02.23
13:48
(0) Все правильно работодатель сказал.
13 Мультук
 
гуру
20.02.23
13:48
(0)

   |    И НЕ Номенклатура.ПометкаУдаления


Это было в тех.задании или "самостоятельное творчество" ?

Продажи на 2 млн по тем позициям, что продали, вывели и пометили на удаление в прошлом квартале тю-тю из отчета ?
14 lenkavovka
 
20.02.23
13:49
(8) Да, поле видел. Но в возрастной базе, в которой проверял решение, ДействуетС у старых контрагентов не заполнено. Поэтому более универсальным и надёжным решением посчитал использовать номер строки.
15 lenkavovka
 
20.02.23
13:50
(11) Обозначивали до двух часов.
16 PR
 
20.02.23
13:50
Мне вот интересно, почему не СКД?
Удобнее же было бы и не нужно никаких выводов, ни на БСП ни на не БСП
17 ptiz
 
20.02.23
13:51
(7) Прочитайте хотя бы одну книжку по разработке в 1С:Предприятие. По-другому дыры в базовых знаниях не закрыть.
18 lenkavovka
 
20.02.23
13:51
(13) Встречал и такое, личный опыт.
19 eddy_n
 
20.02.23
13:52
Мой опыт, сын ошибок трудных:
1. Не всякие ещё и отвечают. Это как в консульстве - получаешь отказ без объяснения причин. Так что ты - везунчик можно сказать.
2. Во всех подобных задачах отсутствует чёткая формализация. Иногда может быть намеренно, а иногда - по неопытности того, кто давал задачу. Миллион вопросов задашь, перед тем как начнёшь выполнять этот опус.
20 PR
 
20.02.23
13:53
(18) Что встречал, что личный опыт?
Тебе говорят, что ты накосячил, а ты в ответ ну да, был у меня такой опыт
21 eddy_n
 
20.02.23
13:55
Есть конечно спорный момент по-поводу индексирования полей во временных таблицах, по которым будет потом вестить соединение.
22 Fedor-1971
 
20.02.23
13:55
(7) РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, , )  имеет смысл поставить отбор по ключу аналитики, чай уже их выбрал
23 1Снеговик
 
гуру
20.02.23
13:58
(22) внутреннее соединение ничуть не хуже, даже лучше. Иначе в условиях виртуальной таблицы надо делать запросы через ВЫБРАТЬ, что не очень красиво, да и 1С не рекомендует.
24 magicSan
 
20.02.23
14:00
(9) потому что .РОдитель.родитель пропорционально количеству вложений будет работать быстрей
25 Fedor-1971
 
20.02.23
14:01
(23) зависит от объёма данных, иногда внутреннее соединение быстрее, иногда через Выбрать быстрее (нужно смотреть на данные)
26 Fedor-1971
 
20.02.23
14:03
25+ Причём, не угадать заранее, только в работе вылазят косяки по мере накопления данных
27 eddy_n
 
20.02.23
14:03
(22) + Конечно, напрямую измерения Организация нет в этом регистре. Но договорами можно было бы наверное сыграть в отборе в вирт. таблице.
Лучше бы вначале вытащить всё из вирт. таблицы оптимальным запросом. Поместить во временную, потом с ней работать. Спасибо, что хотя бы не делашь соединения с этой вирт. таблицей.
28 lenkavovka
 
20.02.23
14:04
(20) Почему же является косяком нежелание таскать с собой охапку удалённых позиций номенклатуры? Я работал в базе, где при внедрении интернет-магазина с доставкой "под заказ" зачем-то залили в базу несколько десятков тысяч карточек номенклатуры, потом пометили на удаление, чтобы не мешала менеджерам. Но факт, если кто-то зачем-то пометит ранее продававшийся товар, отчёт покажет неверные данные. Спасибо! Впрочем, в оценке замечаний как раз к верности результата нет.
29 eddy_n
 
20.02.23
14:04
От построителя надо уходить. Не модная сегодня вещь.
30 eddy_n
 
20.02.23
14:05
Сегодня рулит СКД.
31 АгентБезопасной Нацио
 
20.02.23
14:06
(27) в аналитике по партнерам
32 magicSan
 
20.02.23
14:08
(29) там нет построителя запроса - в терминлогии проверяющий путается
33 lenkavovka
 
20.02.23
14:09
(30) А как в СКД использовать БСП? Точнее при желании использовать можно, но зачем? Работодатель же выкатил претензию по БСП в том числе.
34 eddy_n
 
20.02.23
14:10
(33) Согласен. Это из той серии, что кое-кто сам не знает, чего хочет.
35 eddy_n
 
20.02.23
14:11
Если тебе предлагают принести то, не знамо что, отнести туда, не знамо куда - не связывайся. Себе дороже потом будет.
36 Xapac
 
20.02.23
14:11
(0)
в ТЗ есть:
Не использовать "метод через построитель запроса"
Делать с помощью "макета"
Использовать "БСП при выводе"?
(запрос не смотрел подробно ибо лень, на первый взгляд "ПОМЕСТИТЬ ВТ_Номенклатура" - лишнее действие)
Если нет. то ищи другого работодателя.
37 eddy_n
 
20.02.23
14:14
ЭТО ЗАГАДОЧНОЕ СЛОВО - ПРОДАВАЛИСЬ? По 45 уходили на консигнацию?
38 Злопчинский
 
20.02.23
14:18
(37) продажа - переход права собственности. как-то так...
39 magicSan
 
20.02.23
14:25
(33) неее, тебе надо было вместо построителя отчета выкатить программное создание СКД со схемами запроса )))
40 eddy_n
 
20.02.23
14:27
(39) + 1. Построитель отчёта в связке с Табличным документом - красивое решение ВЧЕРАШНЕГО дня.
41 eddy_n
 
20.02.23
14:30
Сегодня без СКД в булочную не сходишь.
42 Pprog151713
 
20.02.23
14:33
Построитель твой не понравился. Нафига он вообще.
43 eddy_n
 
20.02.23
14:33
(39) + 1. Да. Объект, полученный с использованием БСП. А дальше - ручками компоновать. ЭТОГО ОНИ ХОТЕЛИ!
44 eddy_n
 
20.02.23
14:35
Тогда бы и овцы были цели и волки сыты. И БСП бы задействовал и СКД бы применил.
45 eddy_n
 
20.02.23
14:38
Короче: тебе ставилась задача решить оптимально неоптимальным методом. ВСЁ!
46 Новиков
 
20.02.23
14:42
(0) думаю тебе везде поставить индексировать, сделать вызов печ.формы БСП из внешней обработки, с автонумерацией - либо в тч, либо через СКД с простой компновкой. В целом, не вижу разгромного поражения, но и актуального решения текущего момента тоже. ЗАпрос сделал, что не индексировал, жалко что ли? Печать придумал, так что не через стандартную бспшную форму? Т.е. просто тупо поспешил и не дожал. С другой стороны, если бы я тебя собесил, я бы все это голосом вспросил да и все. Если ты сам все делал и не дурачок - устно бы ответил. Ну или в текст задачи вписал бы это в явном виде. В целом, это хорошо что ты туда не попал, т.к. с таким подходом тебя там зае.
47 NorthWind
 
20.02.23
14:49
(0) ну и хрен с ними, забейте. Я не фанат Темы Лебедева, но в свое время он приводил хорошее сравнение между начинающим дизайнером и опытным. Начинающий, беседуя с воображаемым заказчиком, вопрошает: "я не мил тебе?", а опытный задает тот же вопрос, читая его задом наперед :)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой