gifts2017

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

Опубликовал Александр Браун (BraunAlex) в раздел Программирование - Сертификация

Практические занятия. Решение задач из сборника задач при подготовке к сертификату Специалист по Платформе 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 Цикл
            Списать = Мин(СписатьВсего, Выборка.КолОст);
            Если Списать = Выборка.КолОст Тогда
                Себестоимость = Выборка.СумОст;
            Иначе
                Себестоимость = Списать * Выборка.СумОст / Выборка.КолОст;
            КонецЕсли;
            
            Движение = Движения.Проводки.Добавить();
            Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
            Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
            Движение.Период = Дата;
            Движение.Организация = Поставщик;
            Движение.КоличествоКт = Списать;
            Движение.Сумма = Себестоимость;
            Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПоставщика;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия;
            
            СписатьВсего = СписатьВсего - Списать;
        КонецЦикла;
        
        Движение = Движения.Проводки.Добавить();
        Движение.СчетДт = ПланыСчетов.Управленческий.Товары;
        Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики;
        Движение.Период = Дата;
        Движение.Организация = Покупатель;
        Движение.КоличествоДт = ВыборкаНоменклатура.КолДок;
        Движение.Сумма = ВыборкаНоменклатура.СумДок;
        Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура;
        Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПокупателя;
        Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка;
        
        СуммаПродажи = СуммаПродажи + ВыборкаНоменклатура.СумДок;
    КонецЦикла;
    
    Если Не Отказ Тогда
        Движение = Движения.Проводки.Добавить();
        Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
        Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
        Движение.Период = Дата;
        Движение.Организация = Поставщик;
        Движение.Сумма = СуммаПродажи;
        Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
        Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель;
    КонецЕсли;
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Архив решений 50
.rar 13,87Mb
17.08.16
50
.rar 13,87Mb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Александр (chilyagin) 27.08.16 12:23
В *.dt по задачам бизнес-процессах ваш вариант кода не отработает корректно, если в конфигураторе в список пользователей будет добавлен имя пользователя, имени которого не добавлено в справочник ФЛ.
Ваш код


Правильнее оформить условие вот так:
	Если ТекПол.Пустая()Тогда
		ТекПол = Справочники.ФизическиеЛица.СоздатьЭлемент();
		ТекПол.Наименование = ИмяПользователя();
		ТекПол.Записать();
	КонецЕсли;
...Показать Скрыть
3. Александр Браун (BraunAlex) 06.09.16 12:15
(2) chilyagin,
Однако, отрабатывало корректно на 100%. И именно такой код дают при подготовке на спеца и при решении сквозной задачи.
К тому же читаем справку:
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
НайтиПоНаименованию (FindByDescription)

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

Возвращаемое значение:
Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.


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

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


Ваш код в данном контексте будет ошибочным, т.к. поиск производится по точному совпадению и ссылки справочника не существует, т.е. Неопределено.
4. white mount (white-mount) 06.09.16 12:24
(3) BraunAlex,
Однако, отрабатывало корректно на 100%.

И сколько человек получили сертификат "специалист" по платформе или бухучёту с этим кодом?
5. Александр Браун (BraunAlex) 06.09.16 12:33
(4) white-mount, Не умничай. Проверил - да, действительно. Не задавался целью ставить под сомнение подготовительные курсы.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа