Решение задач при подготовке на Специалиста по платформе по 1С:8.3

Практические занятия. Решение задач из сборника задач при подготовке к сертификату Специалист по Платформе 1С 8.3.

Пока готовился на спеца по платформе мной были решены многие задачи из сборника. Выкладываю свои решения по решению:

  1. Оперативных задач (23 задачи: 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 15, 17, 24, 26, 28, 31, 32, 36, 37, 40, 42, 45).
  2. Бухгалтерских задач (21 задача: 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 14, 15, 18, 23, 27, 29, 31, 32, 33, 35)
  3. Расчетных задач (24 задачи: 01, 02, 03, 04, 05, 06, 07, 09, 12, 13, 15, 17, 16, 17, 18, 19, 20, 21, 22, 23, 27, 35, 43, 45, 48)
  4. Бизнес задачи присутствуют.

Может, кому пригодится при подготовке в качестве учебного материала. Текстовки задач в архиве отсутсвуют, дабы не нарушать соглашение.

PS: После прорешивания сдал с первого раза.

Пример решения Задачи по Бухгалтерии:

Необходимо реализовать возможность ведения учета товаров в разрезе организаций, мест хранения и партий товаров. Подразумевается, что для каждой организации баланс будет формировать отдельно (каждая организация это отдельное юридическое лицо). Склады у организаций «общие» (привязки склада к конкретной организации нет, но товар может принадлежать только одной организации). Под партией товара понимается документ, регистрирующий его поступление.

Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» — Km «Поставщики» на количество и сумму закупаемого товара.

В системе необходимо реализовать документ, который осуществлял бы перемещение товара между собственными организациями (с возможным изменением склада компании). Фактически подобное перемещение будет регистрировать сразу две операции: продажа товара поставщиком покупателю и покупка покупателем товара у поставщика. Регистрация этих операций будет осуществляться документом «КупляПродажа». В шапке документа (при его заполнении) указывается организация-покупатель, организация-поставщик, склад организации-покупателя и склад организации-поставщика.

Документ «КупляПродажа» реализует следующие проводки:

По организации-поставщику:

Дт «Прибыли и убытки» — Km «Товары» на количество сумму себестоимости. Себестоимость товара рассчитывается для каждой организации в разрезе партий и складов по каждой номенклатурной позиции.

Дт «Покупатели» — Km «Прибыли и убытки» на сумму в продажных ценах;

По организаиии-пуодавцу: Дт «Товары» — Km «Поставщики» на сумму закупаемого товара

Решение:

Не буду расписывать создание объектов. Сразу к делу.

Документ «Приходная накладная» модуль объекта:

Процедура ОбработкаПроведения(Отказ, Режим)
//Блокировки накладывать смысла нет, тут только увеличиваем остатки.
// регистр Проводки
Движения.Проводки.Записывать = Истина;
Движения.Проводки.Очистить();
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.Проводки.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Товары;
Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка;
КонецЦикла;
КонецПроцедуры

Документ «Купля продажа» модуль объекта:

Процедура ОбработкаПроведения(Отказ, Режим)

//Накладываю блокировки
// Без них можно даже не идти на экзамен
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Проводки");
ЭлементБлокировки.УстановитьЗначение("Организация", Поставщик);
ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

// регистр Проводки
//Ставлю признак, что бы платформа сама записала движения в регистр
Движения.Проводки.Записывать = Истина;

//Делаю по старинке - сначала формирую остатки, потом делаю движения.
//Т.к. имеется условное проведение и в добавок присутствуют партии товаров.

//Запрос по остаткам в регистре бухгалтерии
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    КупляПродажаСписокНоменклатуры.Номенклатура КАК Номенклатура,
|    Минимум(КупляПродажаСписокНоменклатуры.НомерСтроки) КАК НС,
|    СУММА(КупляПродажаСписокНоменклатуры.Количество) КАК КолДок,
|    СУММА(КупляПродажаСписокНоменклатуры.Сумма) КАК СумДок
|ПОМЕСТИТЬ Товары
|ИЗ
|    Документ.КупляПродажа.СписокНоменклатуры КАК КупляПродажаСписокНоменклатуры
|ГДЕ
|    КупляПродажаСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|    КупляПродажаСписокНоменклатуры.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
|    Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Товары.Номенклатура КАК Номенклатура,
|    Товары.НС КАК НС,
|    Товары.КолДок КАК КолДок,
|    Товары.СумДок КАК СумДок,
|    ПроводкиОстатки.Субконто3 КАК Партия,
|    ЕСТЬNULL(ПроводкиОстатки.КоличествоОстаток, 0) КАК КолОст,
|    ЕСТЬNULL(ПроводкиОстатки.СуммаОстаток, 0) КАК СумОст
|ИЗ
|    Товары КАК Товары
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Проводки.Остатки(
|                &МоментВремени,
|                Счет = &СчетТовары,
|                &МассивСубконто,
|                Организация = &Организация
|                    И Субконто2 = &СкладПоставщика
|                    И Субконто1 В
|                        (ВЫБРАТЬ
|                            Товары.Номенклатура
|                        ИЗ
|                            Товары КАК Товары)) КАК ПроводкиОстатки
|        ПО Товары.Номенклатура = ПроводкиОстатки.Субконто1
|
|УПОРЯДОЧИТЬ ПО
|    ПроводкиОстатки.Субконто3.МоментВремени
|ИТОГИ
|    МАКСИМУМ(НС),
|    МАКСИМУМ(КолДок),
|    МАКСИМУМ(СумДок),
|    СУММА(КолОст)
|ПО
|    Номенклатура";

//Работаю только с теми видами субконто, которые мне необходимы в задаче
// Добавлю себе +. Что бы лишних вопросов не было
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия);

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

Результат = Запрос.Выполнить();

//Обхожу по группировкам
// и создаю наборы движений
ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

СуммаПродажи = 0;
Пока ВыборкаНоменклатура.Следующий() Цикл

Если ВыборкаНоменклатура.КолОст < ВыборкаНоменклатура.КолДок Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара: " + ВыборкаНоменклатура.Номенклатура + " на складе " + СкладПоставщика + ". В наличии  " + ВыборкаНоменклатура.КолОст + " ед.";
Сообщение.Поле = "СписокНоменклатуры[" + (ВыборкаНоменклатура.НС - 1) + "].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

Выборка = ВыборкаНоменклатура.Выбрать();

СписатьВсего = ВыборкаНоменклатура.КолДок;

Пока Выборка.Следующий() И СписатьВсего > 0 Цикл
Списать = Мин(СписатьВсего, Выборка.КолОст);
Если Списать = Выборка.КолОст Тогда
Себестоимость = Выборка.СумОст;
Иначе
Себестоимость = Списать * Выборка.СумОст / Выборка.КолОст;
КонецЕсли;

Движение = Движения.Проводки.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.Период = Дата;
Движение.Организация = Поставщик;
Движение.КоличествоКт = Списать;
Движение.Сумма = Себестоимость;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПоставщика;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия;

СписатьВсего = СписатьВсего - Списать;
КонецЦикла;

Движение = Движения.Проводки.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Товары;
Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Движение.Период = Дата;
Движение.Организация = Покупатель;
Движение.КоличествоДт = ВыборкаНоменклатура.КолДок;
Движение.Сумма = ВыборкаНоменклатура.СумДок;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПокупателя;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка;

СуммаПродажи = СуммаПродажи + ВыборкаНоменклатура.СумДок;
КонецЦикла;

Если Не Отказ Тогда
Движение = Движения.Проводки.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Организация = Поставщик;
Движение.Сумма = СуммаПродажи;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
КонецЕсли;
КонецПроцедуры

11 Comments

  1. chilyagin

    В *.dt по задачам бизнес-процессах ваш вариант кода не отработает корректно, если в конфигураторе в список пользователей будет добавлен имя пользователя, имени которого не добавлено в справочник ФЛ.

    Ваш код

    Правильнее оформить условие вот так:

     Если ТекПол.Пустая()Тогда
    ТекПол = Справочники.ФизическиеЛица.СоздатьЭлемент();
    ТекПол.Наименование = ИмяПользователя();
    ТекПол.Записать();
    КонецЕсли;
    
    Reply
  2. BraunAlex

    (2) chilyagin,

    Однако, отрабатывало корректно на 100%. И именно такой код дают при подготовке на спеца и при решении сквозной задачи.

    К тому же читаем справку:

    СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)

    НайтиПоНаименованию (FindByDescription)

    НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)

    Возвращаемое значение:

    Тип: СправочникСсылка.<Имя справочника>; Неопределено.

    Ссылка на найденный элемент справочника.

    Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.

    Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.

    СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>)

    Пустая (IsEmpty)

    Возвращаемое значение:

    Тип: Булево.

    Истина — ссылка не указывает ни на какой объект (пустая ссылка); Ложь — в противном случае.

    Ваш код в данном контексте будет ошибочным, т.к. поиск производится по точному совпадению и ссылки справочника не существует, т.е. Неопределено.

    Reply
  3. white-mount

    (3)

    Однако, отрабатывало корректно на 100%.

    И сколько человек получили сертификат «специалист» по платформе или бухучёту с этим кодом?

    Reply
  4. BraunAlex

    (4) white-mount, Не умничай. Проверил — да, действительно. Не задавался целью ставить под сомнение подготовительные курсы.

    Reply
  5. cmd_vasec

    Вопросы:

    1. Почему вы используете определение режима проведения — на экзамене это ошибка или нет?

    2. При выводе нехватки товара вы выводите ссылку номенклатура (неявное обращение к базе), а надо представление. Или я ошибаюсь?

    Reply
  6. BraunAlex

    (6) 1. Лучше использовать определение режима. В некоторых задачах будет считаться ошибкой/недочетом неумение пользоваться этим свойством/методом. С другой стороны Вы теряете время на написание кода.

    2. Используйте представление. Но и использование ссылок не будет ошибкой/недочетом, т.к. перед нами не стоит задачи по оптимизации кода.

    Reply
  7. cmd_vasec

    (7) 1. Приведите, пожалуйста пример.

    2. А не будет ли это запрос в цикле?

    Reply
  8. BraunAlex

    (8) 1. Смотрите в примерах и задачи в сборнике задач. Я сейчас не вспомню. Давно подготовку проходил.

    2. Что именно? К использованию ссылок внутри конструкций цикла по выборке не придираются. Или мне повезло 🙂 Вы же не на эксперта идете сдавать. Или…?

    Reply
  9. Hans

    Загрузил первую задачу по ОУ, пересчеты суммы строки, пересчет суммы документа при изменении табличных частей не нужно что ли делать?

    Reply
  10. BraunAlex

    (10) На сколько помню, в постановке задачи такого условия не было (ни в одной). Зачем придумывать дополнительную работу, тем более что время жестко ограничено?

    Reply
  11. DarkUser

    Спасибо за решения. Сейчас как раз готовлюсь и так же решаю задачи по сборнику. Хорошо когда можно сравнить свой код с решениями других программистов.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *