Yermek T. Zhubatyrov

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Бухгалтерский учет (2.31)

Печать

Итак, друзья мои. Сегодня я опишу еще одно решение из сборника задач по подготовке к экзамену 1С:Специалист. На этот раз это будет задача из раздела бухгалтерского учета за номером 2.31.

Сначала настрою справочники. Во первых, добавлю новый справочник «Места хранения». Он нам нужен лишь для того, что бы реализовать складской учет на счетах хранения товаров. Следующий шаг, корректировка справочника номенклатуры.

Здесь дела обстоят несколько сложнее, По заданию у нас сказано, что в системе должна хранится информация о составе комплекта. Так же, поставлено условие, что система должна позволять вести складской учет на любом счете. Для этого создам у справочника реквизит «Счет учета» - ссылка на наш план счетов. Забегая вперед, скажу, что в принципе, указание этого счета не обязательно, и система по умолчанию будет брать счет «Товары», но если счет указан, то именно на нем и должен учитываться товар.

Далее добавлю реквизит «Комплект» являющийся признаком того, что при списании необходимо списывать не сам товар, а его комплектующие. Тип, соответственно, будет «Булево». Добавлю в систему новый регистр сведений, обзову который «СоставКомплекта». В нем будет два измерения: «Комплект», «Материал», и один ресурс «Количество». В нем собственно и будет хранится информация о тех комплектующих, которые входят в наш набор. Далее в модуле объекта метаданных в процедуру «ПриЗаписи» добавлю проверку того, что бы реквизиты заполнялись верно.

Процедура ПриЗаписи(Отказ, Замещение)
    Отказ = НЕ ЭтотОбъект.Отбор.Комплект.Значение.Комплект;
    Если Не Отказ Тогда 
        Отказ = ЭтотОбъект.Отбор.Материал.Значение.Комплект;
    КонецЕсли;
КонецПроцедуры

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

Все. На этом настройка справочной информации закончена. Переду к объектам хранения данных

Как обычно начну с настройки плана видов характеристик «ВидыСубконто», плана счетов, и регистра бухгалтерии. Особо на них заостряться не буду, так как их настройка подробно описана в предыдущих моих решениях. Остановлюсь только на особенностях:

Для плана видов характеристик расширю тип значения справочником «Места хранения». Так же в предопределенные элементы добавлю новый вид характеристики «Комплектующие» типа «Справочник.Номенклатура».

 

Для плана счетов, как и ранее укажу на закладке данные признак учета «Количественный», на закладке субконто выставлю максимальное количество субконто в два. Так же свяжу с соответствующим планом видов характеристик, и создам признак учета для субконто – «Количественный». Далее добавлю ко всем счетам, по которым предполагается ведение учета товаров два вида субконто – номенклатура и места хранения.

Для отчета нам понадобится информация о том, какое количество каких комплектующих было списано на тот или иной комплект. Для этого я добавляю новый предопределенный забалансовый счет «ОборотКомплектов». Укажу у него признак количественного учета, а так же подключу два субконто: Номенклатура – наш комплект, и Комплектующие – то, что было списано при продаже комплекта. В поле «Количество» при проведении будет указываться информация о количестве проданных комплектующих. В поле сумма – их продажная сумма (которая будет вычисляться из стоимости комплекта)

 

Добавление регистра бухгалтерии ничем не отличается от аналогичной операции в решении первого задания из сборника. Привязка к плану счетов, указание признака корреспонденции. Два ресурса Сумма – балансовый ресурс, и количество – не балансовый ресурс. Для поля «Количество» так же указывается привязка к признакам учета из плана счетов, как для счета в целом, так и для субконто.

 

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

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

КонецПроцедуры 

И все. Переходим к расходной накладной. Здесь так же в реквизиты добавлю склад.

Текст процедуры обработки проведения в самом конце:

  1. В начале процедуры произведу контроль на заполнение поля склад.
  2. Очищу движения, если документ уже был проведен
  3. Создам запрос, который будет содержать следующие таблицы
    1. «НоменклатураДокумента» -- таблица товаров документа. (Поля «Номенклатура, счет учета (если у номенклатуры не указан, то счет «Товары»), количество и сумма)
    2. «ВсеКомплектующие» -- объединение двух таблиц
      • Таблицы, которая получена из таблицы «НоменклатураДокумента» товары в которой не являются комплектами
      • Таблица регистра сведений «СоставКомплекта», с наложением данных на таблицу номенклатуры документа, с выбранными комплектами. Связь по полям «Комплект» регистра и «Номенклатура» таблицы документа. Поля «Комплект», «Номенклатура» (указываются комплектующие), счет учета, количество и сумма реализации
    3. Результирующая таблица, являющаяся связью таблицы «ВсеКомплектующие», и виртуальной таблицы остатков нашего регистра бухгалтерии. Так же в этой таблице добавляются «расчетные» поля в которых содержится себестоимость такого количества товара, которое указано в документе.

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

Далее делается две выборки, по уровням результата запроса. В первой мы вычисляем коэффициент для того, что бы высчитать продажную стоимость комплекта, и запоминаем общую стоимость реализации, что бы потом «подогнать» общую стоимость комплектующих под стоимость комплекта. На втором уровне проверяется наличие доступного товара на списание и две обязательные проводки – списание себестоимости товара, и задолженность покупателя. Так же если, списывается комплектующее, то формируется и третья проводка по забалансовому счету «ОборотКомплектов»

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

    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Движения.Управленческий.Записывать = Истина;
    Движения.Управленческий.Очистить();
    
    Пока Выборка.Следующий() Цикл
        ОбходКомплектов = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Коэффициент = 0;
        Если Выборка.СебестоимостьНакладной > 0 Тогда
            Коэффициент = Выборка.Сумма/Выборка.СебестоимостьНакладной;
        КонецЕсли;
        ОсталосьРаспределить = Выборка.Сумма;
        Пока ОбходКомплектов.Следующий() Цикл
            Если ОбходКомплектов.Количество > ОбходКомплектов.КоличествоОстаток Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно "+(ОбходКомплектов.Количество-ОбходКомплектов.КоличествоОстаток)+" шт. товара 
                |"+ОбходКомплектов.Номенклатура+?(ОбходКомплектов.ЯвляетсяКомплектом," (комплект "+ОбходКомплектов.Комплект+")","");
                Сообщение.Сообщить();
                Отказ = Истина;
                Продолжить;
            КонецЕсли;
            
            Движение = Движения.Управленческий.Добавить();
            Движение.Период = Дата;
            Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
            Движение.СчетКт = ОбходКомплектов.СчетУчета;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ОбходКомплектов.Номенклатура;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.МестаХранения] = Склад;
            Движение.КоличествоКт = ОбходКомплектов.Количество;
            Движение.Сумма = ОбходКомплектов.СебестоимостьНакладной;
            Движение.СодержаниеПроводки = "Списана себестоимость "+ОбходКомплектов.Номенклатура;
            
            СуммаКСписанию = Окр(Коэффициент*ОбходКомплектов.СебестоимостьНакладной,2);
            ОсталосьРаспределить = ОсталосьРаспределить-СуммаКСписанию;
            Если ОсталосьРаспределить < 1 Тогда 
                СуммаКСписанию = СуммаКСписанию+ОсталосьРаспределить; 
                ОсталосьРаспределить = СуммаКСписанию;
            КонецЕсли;
            
            Движение = Движения.Управленческий.Добавить();
            Движение.Период = Дата;
            Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
            Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
            Движение.Сумма = МИН(ОсталосьРаспределить,СуммаКСписанию);
            Движение.СодержаниеПроводки = "Доход от реализации "+ОбходКомплектов.Номенклатура;
            
            Если ОбходКомплектов.ЯвляетсяКомплектом Тогда
                Движение = Движения.Управленческий.Добавить();
                Движение.Период = Дата;
                Движение.СчетДт = ПланыСчетов.Управленческий.ОборотКомплектов;
                Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ОбходКомплектов.Комплект;
                Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Комплектующие]= ОбходКомплектов.Номенклатура;
                Движение.СодержаниеПроводки = "Регистрация продажи "+ОбходКомплектов.Номенклатура+" на "+ОбходКомплектов.Комплект;
                Движение.Сумма = МИН(ОсталосьРаспределить,СуммаКСписанию);
                Движение.КоличествоДт = ОбходКомплектов.Количество;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Получение данных для отчета будет производится со счета «ОборотКомплектов», а так же со счетов, которые указаны для комплектующих. Текст запроса прост, а воспользоваться конструктором настроек, думаю что сможет каждый.

 
 ВЫБРАТЬ
    УправленческийОбороты.Субконто1 КАК Комплект,
    УправленческийОбороты.Субконто2 КАК Номенклатура,
    УправленческийОбороты.КоличествоОборотДт КАК КоличествоНоменклатуры,
    УправленческийОбороты.СуммаОборотДт КАК СуммаПродажи,
    ВЫБОР
        КОГДА УправленческийОбороты.Субконто2.СчетУчета = &ПустойСчет
            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары)
        ИНАЧЕ УправленческийОбороты.Субконто2.СчетУчета
    КОНЕЦ КАК СчетУчета
ПОМЕСТИТЬ Комплекты
ИЗ
    РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОборотКомплектов), , , , ) КАК УправленческийОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    УправленческийОбороты.Субконто1,
    УправленческийОбороты.СуммаОборотКт КАК СебестоимостьРеализации,
    УправленческийОбороты.КоличествоОборотКт КАК КоличествоРеализации
ПОМЕСТИТЬ Себестоимость
ИЗ
    РегистрБухгалтерии.Управленческий.Обороты(
            ,
            ,
            ,
            Счет В
                (ВЫБРАТЬ
                    Комплекты.СчетУчета
                ИЗ
                    Комплекты КАК Комплекты
                СГРУППИРОВАТЬ ПО
                            Комплекты.СчетУчета),
            ,
            Субконто1 В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    Комплекты.Номенклатура
                ИЗ
                    Комплекты КАК Комплекты),
            ,
            ) КАК УправленческийОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Комплекты.Комплект,
    Комплекты.Номенклатура,
    Комплекты.СуммаПродажи,
    Комплекты.КоличествоНоменклатуры,
    Себестоимость.СебестоимостьРеализации,
    Себестоимость.КоличествоРеализации
ИЗ
    Комплекты КАК Комплекты
        ЛЕВОЕ СОЕДИНЕНИЕ Себестоимость КАК Себестоимость
        ПО Комплекты.Номенклатура = Себестоимость.Субконто1

На этом все, спасибо, как говорится, за внимание

 

Комментарии  

 
0 # RE: Бухгалтерский учет (2.31)Yermek T. Zhubatyrov 06.04.2011 16:25
эждлбэджлбэджбд зэ
Ответить | Ответить с цитатой | Цитировать
 
 
0 # RE: Бухгалтерский учет (2.31)Yermek T. Zhubatyrov 06.04.2011 16:25
эждлбэджлбэджбд зэ
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий


Защитный код
Обновить