Здравствуйте. В этом году заканчиваю 11 класс, хотел на лето найти стажировку, начать набирать навыки и опыт. Откликнулся на кучу вакансий, везде отказываются брать новичка. Но несколько недель назад получил предложение выполнить тестовую задачу. Суть задачи: есть форма обработки со списком заказов клиентов (динамический список). Нужно добавить на форму кнопку, по которой будут создаваться реализации товаров по выбранным заказам, и настроить условное оформление, чтоб заказы, по которым созданы реализации, подсвечивались. С задачей долго возился, но в итоге сделал (огромное спасибо user2107191 за подсказку, где и что нужно смотреть). Сдал задачу работодателю, в понедельник ответом получил письмо с содержанием : "К большому сожалению не можем взять вас на стажировку, в коде допущено много ошибок и ваше решение не является решением по стандартам разработки 1с специалист". Попросил указать, в чем именно заключаются ошибки, чтобы поработать над их исправлением, ответа так и не получил. Подскажите, плиз, в чем заключаются ошибки? Где можно почитать стандарты разработки 1с специалист? Нашел руководство разработчика, но не знаю, в какой главе смотреть то, что мне нужно (поэтому начал шерстить с самого начала). Решение задачи прикладываю. (функция ПолучитьПосленийНомерРеализаций() ничего не возвращает, добавил ее чтоб присваивался номер реализации, без нее номер создавался 00-000000, и при повторном создании реализаций программа выдавала ошибку номер не уникален 00-000000)
```1c
    &НаСервере
    Процедура РеализацияТоваровУслугНаСервере(МассивЗаказов)
    Если МассивЗаказов.Количество() > 0 Тогда
    СписокРеализацийПоЗаказам = ПолучичтьРеализацииПоЗаказам(МассивЗаказов);
    Для Каждого ДокументЗаказ Из МассивЗаказов Цикл
    ЕстьРеализация = ?(СписокРеализацийПоЗаказам.Найти(ДокументЗаказ) = Неопределено, Ложь, Истина);
    Если ЕстьРеализация Тогда
    Продолжить;
    КонецЕсли;
    ДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    ЗаполнитьЗначенияСвойств(ДокРеализация, ДокументЗаказ);
    ДокРеализация.ВалютаВзаиморасчетов = ДокументЗаказ.Валюта;
    ДокРеализация.ДатаВозвратаМногооборотнойТары = МногооборотнаяТараСервер.РассчитатьДатуВозвратаМногооборотнойТары(
    ДокРеализация,
    ДокументЗаказ.СрокВозвратаМногооборотнойТары,
    Ложь,
    Справочники.ПроизводственныеКалендари.ПустаяСсылка());
    ПродажиСервер.ЗаполнитьБанковскиеСчетаПоДоговору(ДокРеализация.Договор, ДокРеализация.БанковскийСчетОрганизации, ДокРеализация.БанковскийСчетКонтрагента);
    Если Не ЗначениеЗаполнено(ДокРеализация.БанковскийСчетОрганизации) Тогда
    СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
    СтруктураПараметров.Организация = ДокРеализация.Организация;
    СтруктураПараметров.БанковскийСчет = ДокРеализация.БанковскийСчетОрганизации;
    ДокРеализация.БанковскийСчетОрганизации = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);
    КонецЕсли;
    Если Не ЗначениеЗаполнено(ДокРеализация.БанковскийСчетКонтрагента) Тогда
    ДокРеализация.БанковскийСчетКонтрагента = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетКонтрагентаПоУмолчанию(ДокРеализация.Контрагент, , ДокРеализация.БанковскийСчетКонтрагента);
    КонецЕсли;
    СкладОтгрузки = ДокРеализация.Склад;
    ДокРеализация.ЗаказКлиента = ДокументЗаказ;
    ДокРеализация.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
    ДокРеализация.РеализацияПоЗаказам = Истина;
    ДокРеализация.Статус = Перечисления.СтатусыРеализацийТоваровУслуг.Отгружено;
    ПараметрыЗаполнения = Новый Структура;
    ПараметрыЗаполнения.Вставить("ВариантОформления", ДокРеализация.ВариантОформленияПродажи);
    ПараметрыЗаполнения.Вставить("ПараметрыОформления", Неопределено);
    МассивЗаказовПараметр = Новый Массив;
    МассивЗаказовПараметр.Добавить(ДокументЗаказ);
    Документы.РеализацияТоваровУслуг.ЗаполнитьПоОстаткамЗаказов(
    ДокРеализация,
    ДокРеализация.Товары,
    ДокРеализация.СкидкиНаценки,
    ?(СкладОтгрузки=Неопределено, Справочники.Склады.ПустаяСсылка(), СкладОтгрузки),
    МассивЗаказовПараметр,
    ПараметрыЗаполнения);
    ДокРеализация.ВариантОформленияПродажи = ?(ЗначениеЗаполнено(ДокРеализация.ВариантОформленияПродажи),
    ДокРеализация.ВариантОформленияПродажи,
    Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг);
    ЗаказыСервер.ЗаполнитьЗаказВШапкеПоЗаказамВТабличнойЧасти(ДокРеализация.ЗаказКлиента, ДокРеализация.Товары, "ЗаказКлиента");
    СкидкиРассчитаны = (ДокРеализация.СкидкиНаценки.Количество() > 0);

    ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ДокРеализация, Документы.РеализацияТоваровУслуг);
    НоменклатураСервер.ЗаполнитьСерииПоFEFO(ДокРеализация,ПараметрыУказанияСерий, Ложь);

    СтруктураОснование = Документы.РеализацияТоваровУслуг.СтруктураОснованияДляПечати(ДокРеализация);
    ЗаполнитьЗначенияСвойств(ДокРеализация, СтруктураОснование);
    ДокРеализация.ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияКассыПриФОИспользоватьНесколькоКассЛ­ожь", Ложь);
    ДокРеализация.ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияСчетаПриФОИспользоватьНесколькоСчето­вЛожь", Ложь);
    ДокРеализация.Автор = Пользователи.ТекущийПользователь();
    ОтветственныеЛицаСервер.ЗаполнитьМенеджера(ДокРеализация, Ложь);

    СкладГруппа = Справочники.Склады.ЭтоГруппаИСкладыИспользуютсяВТЧДокументовПродажи(ДокРеализация.Склад);
    СкладыСервер.ЗаполнитьСкладыВТабличнойЧасти(ДокРеализация.Склад, СкладГруппа, ДокРеализация.Товары, Ложь);
    ДокРеализация.Номер = ПолучитьПосленийНомерРеализаций();
    ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
    КонецЦикла;
    КонецЕсли;
    УстановитьУсловноеОформление();
    КонецПроцедуры

    &НаСервере
    Функция ПолучичтьРеализацииПоЗаказам(МассивЗаказов)
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    Запрос.Текст = "ВЫБРАТЬ
    | ЗаказКлиента КАК ЗаказКлиента
    |ИЗ
    | Документ.РеализацияТоваровУслуг
    |ГДЕ
    | ЗаказКлиента В(&МассивЗаказов)
    | И Проведен";
    Возврат Запрос.Выполнить().Выгрузить();
    КонецФункции

    &НаСервере
    Функция ПолучитьПосленийНомерРеализаций()
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ПараметрГод", Год(ТекущаяДатаСеанса()));
    Запрос.Текст = "Выбрать Максимум(Номер) Из Документ.РеализацияТоваровУслуг Где ГОД(Дата) = &ПараметрГод И Номер Подобно("00%")";
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    КонецФункции

    &НаКлиенте
    Процедура РеализацияТоваровУслуг(Команда)
    ВыделенныеЗаказы = Элементы.СписокЗаказов.ВыделенныеСтроки;
    РеализацияТоваровУслугНаСервере(ВыделенныеЗаказы);
    КонецПроцедуры

    &НаСервере
    Процедура УстановитьУсловноеОформление()
    Запрос = Новый Запрос("ВЫБРАТЬ
    | РеализацияТоваровУслуг.ЗаказКлиента КАК ЗаказКлиента
    |ИЗ
    | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    | РеализацияТоваровУслуг.Ссылка.Проведен
    | И РеализацияТоваровУслуг.ЗаказКлиента В(&МассивЗаказов)");

    Схема = Элементы.СписокЗаказов.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.СписокЗаказов.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    МассивЗаказов = Результат.ВыгрузитьКолонку("Ссылка");

    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    ТабРезультат = Запрос.Выполнить().Выгрузить();

    СписокДокументовУО = Новый СписокЗначений;
    СписокДокументовУО.ЗагрузитьЗначения(ТабРезультат.ВыгрузитьКолонку("ЗаказКлиента"));

    УсловноеОформление.Элементы.Очистить();

    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Использование = Истина;
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноЗеленый);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина);

    ОтборЭлемента = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокЗаказов.Ссылка");
    ОтборЭлемента.ПравоеЗначение = СписокДокументовУО;
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ОтборЭлемента.Использование = Истина;

    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СписокЗаказов");
    ОформляемоеПоле.Использование = Истина;
    КонецПроцедуры
```
---
Не утверждаю, что причина отказа в этом, но.... РТУ делается на основании заказа, поэтому нет необходимости заполнять все вручную как у тебя. Посмотри материал https://its.1c.ru/db/metod8dev/content/3562/hdoc
---
А меня-то за что???
На самом деле эта задача на знание конкретно УТ11, а не на 1С в общем.
В УТ можно сделать что-то типа

```1c
    Для Каждого ДокументЗаказ Из МассивЗаказов Цикл
    ДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    ДокРеализация.Заполнить(ДокументЗаказ);
    ...
```
 и не писать все эти замечательные вещи.

Но вообще молодец. Проделал хорошую работу, приобрел опыт, разобрался с взаимосвязями данных. Здорово же!

Единственно непонятно - нафига ты в установку УО засунул запрос какой-то...
---
А меня-то за что???
На самом деле эта задача на знание конкретно УТ11, а не на 1С в общем.
В УТ можно сделать что-то типа

```1c
    Для Каждого ДокументЗаказ Из МассивЗаказов Цикл
    ДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    ДокРеализация.Заполнить(ДокументЗаказ);
    ...
```
 и не писать все эти замечательные вещи.

Но вообще молодец. Проделал хорошую работу, приобрел опыт, разобрался с взаимосвязями данных. Здорово же!

Единственно непонятно - нафига ты в установку УО засунул запрос какой-то...
---
А меня-то за что??? так это Вы мне подсказали, что нужно движения посмотреть. Посмотрел движения, посмотрел, как создаются документы на основании. Но все равно неправильно сделал, оказывается можно было просто одной строчкой кода все заменить... Возможно, что и номер корректно присваиваться будет.
(4) Единственно непонятно - нафига ты в установку УО засунул запрос какой-то... это для проверки, на основании каких заказов есть реализации. Или там тоже хитрости какие-то, и не нужно нагружать уо запросами?
---
хотел на лето найти стажировку, начать набирать навыки и опыт. Откликнулся на кучу вакансий, везде отказываются брать новичка.
Стажировка и работа за деньги - немного несвязанные вещи.
На стажировку могут взять только будучи уверенным, что после неё ты останешься на предприятии и будешь развиваться и расти внутри процессов именно этого предприятия. Но тут есть опасность -
а) при таком подходе очень часто не приобретается навык работы с типовыми конфигурациями.
б) должен попасться грамотный наставник, который не позволит тебе говнокодить, научит мыслит ьи писать структурировано, масштабируемо, абстрактно (за умением говнокодить можно сходить к любому франчу).
в) много чего должно сойтись.

Жил бы ты в Питере, может я бы и подумал уговорить бизнес на эту авантюру.
Ум у тебя пытливый, язык не косный, с орфографией дружишь, логика присутствует...
---
Стажировка и работа за деньги - немного несвязанные вещи.
На стажировку могут взять только будучи уверенным, что после неё ты останешься на предприятии и будешь развиваться и расти внутри процессов именно этого предприятия. Но тут есть опасность -
а) при таком подходе очень часто не приобретается навык работы с типовыми конфигурациями.
б) должен попасться грамотный наставник, который не позволит тебе говнокодить, научит мыслит ьи писать структурировано, масштабируемо, абстрактно (за умением говнокодить можно сходить к любому франчу).
в) много чего должно сойтись. да, я понимаю все прекрасно. Я и готов был бы работать, но мне еще в универе учиться, это лет 5 как минимум, насколько я знаю, работодатели не очень любят все эти обучения. Про франч тоже наслышан, на форумах читал много информации, что там в основном на скорость ориентируются, а не на качество. Да и с менторами там, как я понял, не очень. А если, как Вы выразились, начать говнокодить, то потом сложно будет отучиться. А так это все не для заработка, а для опыта. Мне было бы достаточно, чтоб периодически скидывали реальные бизнес задачи, и хотя бы небольшую обратную связь давали, чтоб я поработал над ошибками. Хочу на втором-третьем курсе на фриланс попробовать выйти, или попробовать на кого-то работать, совмещать работу с учебой, чтоб слезть с шеи родителей.
---
Не утверждаю, что причина отказа в этом, но.... РТУ делается на основании заказа, поэтому нет необходимости заполнять все вручную как у тебя. Посмотри материал https://its.1c.ru/db/metod8dev/content/3562/hdoc
---
Ну и по номеру тоже какая-то непонятка. У документа должно стоять автонумерация и тогда номер автоматом подтягивается следующий и уникальный
---
Ну и по номеру тоже какая-то непонятка. конфигурация типовая, на замке. Если закомментить строку с номером, то программа создает один документ с номером 00-000000, и на втором выходит ошибка, что этот номер не уникален. После перезахода в программу нумерация становится корректной, но если удалить документ с номером 00-000000, то программа создает его повторно и снова выдает ошибку при следующем создании документа. Сейчас попробую через ДокРеализация.Заполнить(Заказ), возможно так корректно нумероваться документы будут. Спасибо!
---
В базе есть еще документы реализации с другими номерами?
---
да, там и вручную созданные документы, и созданные на основании. Независимо от этого первому документу, создаваемому программно, присваивается номер 00-000000.
---
да, там и вручную созданные документы И какой там самый последний созданный номер?
---
0000-000012
---
Тебе дали какую-то кривую базу, снятую с РИБ, кажись.
И то, что она на замке - совсем не факт, что она не кастомизирована шаловливыми ручками.
---
Нет, все таки это я, видимо, что-то не добавил в код, сейчас как Вы подсказали через заполнить переделал - нумерация корректная стала присваиваться. Спасибо!
---
создавал их до того, как полез программно создавать.
---
Немного написал своих мыслей. С заказами и реализацией не знаком, если что.
Так общие придирки. См комментарии в коде

```1c
    &НаСервере
    Процедура РеализацияТоваровУслугНаСервере(МассивЗаказов)
    Если МассивЗаказов.Количество() > 0 Тогда // Это надо определять до вызова функции
    СписокРеализацийПоЗаказам = ПолучичтьРеализацииПоЗаказам(МассивЗаказов);
    Для Каждого ДокументЗаказ Из МассивЗаказов Цикл
    ЕстьРеализация = ?(СписокРеализацийПоЗаказам.Найти(ДокументЗаказ) = Неопределено, Ложь, Истина);
    Если ЕстьРеализация Тогда // Определение создана ли реализация, как-то не очень выглядит
    Продолжить;
    КонецЕсли;
    ДокРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); // Возможно надо использовать что-то типовое, типа создать на основании
    ЗаполнитьЗначенияСвойств(ДокРеализация, ДокументЗаказ);
    //
    СкладГруппа = Справочники.Склады.ЭтоГруппаИСкладыИспользуютсяВТЧДокументовПродажи(ДокРеализация.Склад);
    СкладыСервер.ЗаполнитьСкладыВТабличнойЧасти(ДокРеализация.Склад, СкладГруппа, ДокРеализация.Товары, Ложь);
    ДокРеализация.Номер = ПолучитьПосленийНомерРеализаций();
    // Номер записываемого документа скорее всего должен генерироваться автоматически, то есть эту строку совсем не надо
    // Если уж сам генерируешь номер, не плохо было бы присвоить следующий номер по-порядку, а не присваивать, тот что уже существует
    // А так же предусмотреть случай, когда в системе еще ни одного документа нет.
    ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
    КонецЦикла;
    КонецЕсли;
    УстановитьУсловноеОформление(); // Если условное оформление делается программно, то это надо делать один раз при старте формы . В этом месте надо только заполнить список (см. ниже)
    КонецПроцедуры

    &НаСервере
    Функция ПолучичтьРеализацииПоЗаказам(МассивЗаказов)
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    Запрос.Текст = "ВЫБРАТЬ
    | ЗаказКлиента КАК ЗаказКлиента
    |ИЗ
    | Документ.РеализацияТоваровУслуг
    |ГДЕ
    | ЗаказКлиента В(&МассивЗаказов)
    | И Проведен";
    Возврат Запрос.Выполнить().Выгрузить();
    КонецФункции

    &НаСервере
    Функция ПолучитьПосленийНомерРеализаций()
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ПараметрГод", Год(ТекущаяДатаСеанса())); // Период, должен быть входящим параметром, зависимым от даты твоего документа, если собираешься сам нумеровать
    Запрос.Текст = "Выбрать Максимум(Номер) Из Документ.РеализацияТоваровУслуг Где ГОД(Дата) = &ПараметрГод И Номер Подобно("00%")"; // Сравнение с годом не использут. Надо сравнивать с диапазоном дат
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    КонецФункции

    &НаКлиенте
    Процедура РеализацияТоваровУслуг(Команда)
    ВыделенныеЗаказы = Элементы.СписокЗаказов.ВыделенныеСтроки;
    РеализацияТоваровУслугНаСервере(ВыделенныеЗаказы); // После создания реализаций, возможно надо обновить список
    КонецПроцедуры

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

    УсловноеОформление.Элементы.Очистить(); // Надо удалять только собственноручно созданные элементы условного оформления

    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Использование = Истина;
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноЗеленый);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина); //?

    ОтборЭлемента = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокЗаказов.Ссылка");
    ОтборЭлемента.ПравоеЗначение = СписокДокументовУО;
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ОтборЭлемента.Использование = Истина;

    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СписокЗаказов");
    ОформляемоеПоле.Использование = Истина;
    КонецПроцедуры
```
---
ЗаполнитьЗначенияСвойств(ДокРеализация, ДокументЗаказ) Правда думаешь, что табличные части тоже заполнятся?
---
Вопрос не по адресу, это к автору