gifts2017

Универсальный алгоритм проведения документа «Поступление товаров» по регистру бухгалтерии

Опубликовал Антонина Городюшко (toniaprel) в раздел Программирование - Практика программирования

Решаемые проблемы:
- выполнение проводок с субсчетов счета Товары (Дт) на счет, указанный пользователем (Кт);
- выявление и запрещение проведения счетов- групп.

1 Настройка объектов конфигурации, используемых при решении поставленной задачи.

 

1.1 План Счетов Хозрасчетный:

v     Закладка «Данные»: 

  • Автопорядок по коду-устанавливаем флажок;
  • Маска кода - @@.@@);
  • Реквизит: ЗапретитьИспользоватьВПроводках(тип Булево) ( Для запрета использования счетов- групп).

v     Закладка «Субконто»: Виды субконто- ВидыСубконто (Название Плана видов характеристик).

v     Закладка «Прочее»: Предопределенные счета- для счетов 41(ТМЦ(группа)), 41.01(Товары), 41.02(Материалы) указываем Вид субконто- Товары (характеристика из ПВХ ВидыСубконто).

 

1.2 План видов характеристик ВидыСубконто:

v     Закладка «Основные»: Тип значения характеристик- СправочникСсылка.Контрагенты, СправочникСсылка.Номенклатура.

v     Закладка «Прочее»: Предопределенные виды характеристик – Товары( тип СправочникСсылка.Номенклатура).

 

  1.3 Регистр бухгалтерии РегистрБухгалтерииХозрасчетный:

v     Закладка «Основные»:

  • План счетов – Хозрасчетный;
  • Корреспонденция- устанавливаем флажок, что обеспечивает двойную запись проводок (Дт – Кт);

v     Закладка Регистраторы»: ПоступлениеТоваров- флажок;

v     Закладка «Данные»:  Ресурс – Сумма (тип Число 15/2) (в свойствах установить флажок «Балансовый»;

 

     1.4 Документ ПоступлениеТоваров:

v     Закладка «Данные»: 

  • Реквизиты-

               -Контрагент (тип СправочникСсылка.Контрагенты);

               - ТипЦены (тип СправочникСсылка.ТипыЦен);

               - СуммаДокумента (тип Число 15/2);

  • Табличная часть: Товары-

               -Номенклатура ( тип СправочникСсылка.Номенклатура),

               - Количество ( тип Число 15/3),

               -Цена (тип Число 15/2);

               -Сумма (тип Число 15/2).

v      Закладка «Движения»: РегистрБухгалтерииХозрасчетный.

 

2 Формирование проводок по регистру бухгалтерии документа ПоступлениеТоваров (Дт субсчета счета Товары- Кт указанного пользователем счета).

 

     Модуль Объекта Документа ПоступлениеТоваров:

 

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

      РезультатОстаткиТоваров = РаботаСДокументаСервер.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата);

   //Вызов функции общего модуля РаботаСДокументамиСервер, возвращающей таблицу значений для загрузки в регистр:

      РезультатТМЦ = РаботаСДокументамиСервер.ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, ПланыСчетов.Хозрасчетный.Поставщики);

   //Вызов процедуры  общего модуля ДвиженияПоРегистрамСервер, формирующей записи в регистре:  

     ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения, РезультатТМЦ); 

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

 

 

    Общий Модуль РаботаСДокументамиСервер (получение таблицы значений для последующей записи в регистр):

 

              В Функции ПолучитьДанныеПоТМЦДокумента с помощью запроса получаем таблицу значений для загрузки в регистр. Требования к таблице значений изложены в Синтакс-помощнике:

*РегистрБухгалтерииНаборЗаписей.<Имя регистра бухгалтерии>

Загрузить (Load)

Синтаксис: Загрузить(<ТаблицаЗначений>)

Параметры: <ТаблицаЗначений> (обязательный)

Тип: ТаблицаЗначений.
Таблица значений, содержащая данные для заполнения набора записей.

Описание: Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются. Заполняются значения доступных для записи свойств записей регистра бухгалтерии, имена которых совпали c именами колонок таблицы значений.
Для каждого субконто создается пара колонок с идентификаторами вида ВидСубконто<Номер>, Субконто<Номер> - для регистра не поддерживающего корреспонденцию, и ВидСубконтоДт<Номер>, СубконтоДт<Номер>, ВидСубконтоКт<Номер>, СубконтоКт<Номер> - для регистра поддерживающего корреспонденцию. При этом номера <Номер> могут не совпадать с номерами видов субконто на соответствующем счете.*

     Для нашего случая Субконто1 (тип СправочникСсылка.Номенклатура) –это позиция, выбираемая из нашего документа, а Вид Субконто1- это значение характеристики из плана видов характеристик.

 

Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет) Экспорт

            ИмяТаблицы = "Документ."+Ссылка.Метаданные().Имя+".Товары";

// В запросе заданы псевдонимы полей: СубконтоДт1 (название товара), ВидСубконтоДт1 (вид характеристик- Товары),

//СчетДт ( Счет 41.01 Товары), СчетКт (вводимый корреспондирующий счет).

         Запрос = Новый Запрос;

         Запрос.Текст = "ВЫБРАТЬ

                        |        &Период,

                        |        ДокТовары.Номенклатура КАК СубконтоДт1,

                        |        ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,

                        |        ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК СчетДт,

                        |        &КорСчет КАК СчетКт,

                        |        СУММА(ДокТовары.Сумма) КАК Сумма

                        |ИЗ

                        |        &ДокументТовары КАК ДокТовары

                        |ГДЕ

                        |        ДокТовары.Ссылка = &Ссылка

                        |        И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)

                        |

                        |СГРУППИРОВАТЬ ПО

                        |        ДокТовары.Номенклатура";

         Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДокументТовары", ИмяТаблицы);                                            

         Запрос.УстановитьПараметр("Ссылка", Ссылка);

         Запрос.УстановитьПараметр("Период", Дата);

         Запрос.УстановитьПараметр("КорСчет", КорСчет);    

         Возврат Запрос.Выполнить(); 

КонецФункции

 

 

     Общий модуль ДвиженияПоРегистрамСервер (загрузка и запись таблицы значений в регистр):

 

Процедура ДвиженияПоБУ(Движения, РезультатТМЦ) Экспорт

         Движения.РегистрБухгалтерииХозрасчетный.Загрузить(РезультатТМЦ.Выгрузить());

         Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина; 

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

 

 

3 Выявление и запрет проведения счетов- групп

     У счетов- групп нет признака ЭтоГруппа, поэтому в качестве признака используем реквизит плана счетов ЗапретитьИспользоватьВПроводках(тип Булево). В плане счетов поддерживается иерархия элементов. При старте системы нужно выполнять проверку на счета- группы и для групповых элементов проставлять флажки, присваивая значение истина реквизиту ЗапретитьИспользоватьВПроводках.

     В момент записи счета нужно анализировать его родителя: если после записи определенного счета (например, счета 10) в пользовательском режиме был добавлен новый подчиненный счет (10.03), то после этого считается, что счет 10 стал родителем, и его нельзя проводить. Следовательно, в момент записи счета 10.03 нужно автоматически проставить флажок запрета для счета 10. Для этого нужно анализировать реквизит счета Родитель.

     Если пользователь отменяет подчинение счета( например, счет 10.03 делает независимым, очищая реквизит Родитель), то нужно после анализа снять флажок запрета у счета 10 (т.к. он перестал быть группой).

     Решение проблемы:

     1) При старте приложения выполняем проверку счетов, чтобы проставить флажки запрета. В модуле управляемого приложения создаем процедуру, вызывающую функцию общего модуля

 

Процедура ПриНачалеРаботыСистемы()             

   ОбщиеФункцииСервер.ПроверитьСчетаГруппы();

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

 

 

     Общий модуль ОбщиеФункцииСервер:

 

Процедура ПроверитьСчетаГруппы() Экспорт

// в запросе ищем все счета- родители (у них заполнен родитель и нет флажка запрета)

         Запрос = Новый Запрос;

         Запрос.Текст =

                    "ВЫБРАТЬ РАЗЛИЧНЫЕ

                    |           Хозрасчетный.Родитель

                    |ИЗ

                    |           ПланСчетов.Хозрасчетный КАК Хозрасчетный

                    |ГДЕ

                    |           Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСЧетов.Хозрасчетный.ПустаяСсылка)

                    |           И НЕ Хозрасчетный.Родитель.ЗапретитьИспользоватьВПроводках";

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

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

//для найденных счетов проставляем флажок запрета

         Пока ВыборкаДетальныеЗаписи.Следующий() Цикл                   

                    СчетОбъект = ВыборкаДетальныеЗаписи.Родитель.ПолучитьОбъект();

                    СчетОбъект.ЗапретитьИспользоватьВПроводках = Истина;

                    СчетОбъект.Записать();                 

         КонецЦикла; 

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

 

 

       2) Анализируем запись счета и реквизит Родитель в процедуре ПередЗаписью модуля объекта плана счетов Хозрасчетный, чтобы снять или проставить флажок:

 

Процедура ПередЗаписью(Отказ)

 //Заполнение  порядока кода с помощью метода ПолучитьПорядокКода():

         Порядок = ПолучитьПорядокКода();

//если у счета- родителя нет флажка запрета, то его проставляем

         Если ЗначениеЗаполнено(Родитель) И НЕ Родитель.ЗапретитьИспользоватьВПроводках Тогда

             СчетОбъект = Родитель.ПолучитьОбъект();

         СчетОбъект.ЗапретитьИспользоватьВПроводках = Истина;

         СчетОбъект.Записать();

         КонецЕсли;

//анализируем старого родителя текущего счета: если у него нет субсчетов, то снимаем флажок запрета

         СтарыйРодитель = Ссылка.Родитель;

         Если СтарыйРодитель <> Родитель Тогда

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

//и изменения не учитываются

                    Запрос = Новый Запрос;

                    Запрос.Текст =

                                "ВЫБРАТЬ ПЕРВЫЕ 1

                                |           Хозрасчетный.Ссылка

                                |ИЗ

                                |           ПланСчетов.Хозрасчетный КАК Хозрасчетный

                                |ГДЕ

                                |           Хозрасчетный.Родитель = &СтарыйРодитель

                                |           И Хозрасчетный.Ссылка <> &ТекущаяСсылка";

 

                    Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель);

                    Запрос.УстановитьПараметр("ТекущаяСсылка", Ссылка);

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

                    //если не нашлись субсчета, то снимаем флажок запрета

                    Если Результат.Пустой() Тогда

                        СчетОбъект = СтарыйРодитель.ПолучитьОбъект();

                                СчетОбъект.ЗапретитьИспользоватьВПроводках = Ложь;

                                СчетОбъект.Записать();

                    КонецЕсли;

         КонецЕсли;      

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

 

 

 

3)Проверку на допустимость счетов при проведении документа выполняем в модуле набора записей регистра бухгалтерии.

 

Процедура ПриЗаписи(Отказ, РежимЗаписи)

// если найдем недопустимые счета( у которых выставлен флажок), то в базу данных не записываем. Объединим два запроса:

//первый- к счетам Дт, второй- к счетам Кт.

   Запрос = Новый Запрос;

   Запрос.Текст =

               "ВЫБРАТЬ

               |           РегистрБухгалтерииХозрасчетный.СчетДт КАК Счет

               |ИЗ

               |           РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный КАК РегистрБухгалтерииХозрасчетный

               |ГДЕ

               |           РегистрБухгалтерииХозрасчетный.Регистратор = &Регистратор

               |           И РегистрБухгалтерииХозрасчетный.СчетДт.ЗапретитьИспользоватьВПроводках

               |

               |ОБЪЕДИНИТЬ ВСЕ

               |

               |ВЫБРАТЬ

               |           РегистрБухгалтерииХозрасчетный.СчетКт

               |ИЗ

               |           РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный КАК РегистрБухгалтерииХозрасчетный

               |ГДЕ

               |           РегистрБухгалтерииХозрасчетный.Регистратор = &Регистратор

               |           И РегистрБухгалтерииХозрасчетный.СчетКт.ЗапретитьИспользоватьВПроводках";

 

   Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);

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

   // Если есть хотя бы одна запись, выставляем отказ в истину и выдаем сообщение. 

   Если Не Результат.Пустой() Тогда

               Отказ = Истина;

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

               Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

                          Сообщение = Новый СообщениеПользователю;

                          Сообщение.Текст = "Счет "+ВыборкаДетальныеЗаписи.Счет+" нельзя использовать в проводках";

                          Сообщение.Сообщить();

               КонецЦикла;

   КонецЕсли;  

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

 

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.