Думаю, что эта тема будет интересна тем, у кого учет торговых операций ведется в ТиС (для платформы 7.7) или УТ, а затем данные по закупкам – продажам переносятся в БП версий 2.0 или 3.0. Фактически происходит дублирование огромных массивов информации, что для нормального ведения бухгалтерского учета абсолютно не нужно.
И это не лично мое мнение, а тех бухгалтеров, которым приходится работать с вечно тормозящими базами данных, в которых перепроводятся накладные, содержащие сотни строк по тысячам позиций номенклатуры. И именно с их подачи я упростил этот процесс.
Суть вот в чем: в качестве товара выступает всегда одна «Предопределенная» позиция справочника номенклатуры. В расходных документах обязательно указывается документ поставки (почти во всех документах в табличной части «Товары» есть реквизит «Документ оприходования») и себестоимость. Данные значения берутся из движений по регистру партионного учета при выгрузке данных из ТиС или УТ. Затем таблицы сворачиваются в разрезе поставок. Десятки строк превращаются в единицы, сотни в 1-2 десятка. Кроме того, что уменьшается объем информации, но еще и ускоряется проведение таких документов по бухучету: при заполненных выше перечисленных реквизитах программа не производит вычисление партий, которые можно списать, а тупо берет указанные.
Объем доработок конфигурации в моем случае оказался минимальным. Для БП 2.0 пришлось доработать:
- «Возврат от покупателя» -добавить реквизит «Документ оприходования» и внести исправление в процедуру проведения.
- «Отчет о розничных продажах» - в процедуре «ДвиженияПоРегистрам» модуля объекта в «СтруктураТаблицыВыручки» добавил еще один ключ «ДокументОприходования».
- «Комплектация номенклатуры». Здесь проблема возникла в части разукомплектации: для указания партий раздербаниваемых комплектов одного реквизита может оказаться недостаточно – может быть списано несколько партий по одной операции. Поэтому пришлось добавить еще одну табличную часть «Комплекты» с тремя колонками «Количество», «Документ оприходования» и «Себестоимость». Ну и перелопатить модуль проведения.
Кроме того, в расходных документах почему-то не представлялось возможным ни просматривать, ни заполнять партии и себестоимость даже там, где они присутствовали в табличных частях.
Фрагменты кода я не привожу, чтобы не загромождать статью уже не очень актуальной информацией – сейчас все переходят на версию БП 3.0. Я тоже готовлюсь. По результатам тестирования «Отчет о розничных продажах» доработок не требует. В 2-х других документах пришлось добавить те же реквизиты и подправить модуль менедмера.
Хочу еще вот о чем сказать. Фирмы, в которых я делал доработки, работают на упрощенке «Доходы минус расходы», поэтому учет по партиям для них обязателен для правильного учета этих самых доходов и расходов.
Мне оч-ч-чень важно узнать мнение сообщества по этому вопросу: допустимо ли то, что я делаю. В свое оправдание хочу лишь сказать, что за те 3 года, в течение которых этот учет имеет место быть. никаких нареканий от пользователей не прозвучало.
Ниже привожу фрагменты кода, котовый пришлось подкорректировать.
Возврат от покупателя МОДУЛЬ МЕНЕДЖЕРА
Функция ТекстЗапросаВременныеТаблицыДокумента(НомераТаблиц)
| ТаблицаТовары.Номенклатура,
| ВЫБОР
| КОГДА ТаблицаТовары.ДокументОприходования ЕСТЬ НЕ NULL
| ТОГДА ТаблицаТовары.ДокументОприходования
| ИНАЧЕ &Ссылка
| КОНЕЦ КАК ДокументОприходования,
Функция ТекстЗапросаСписаниеТоваров(НомераТаблиц, ПараметрыПроведения, Реквизиты)
..................
Если НЕ Реквизиты.ЭтоДоговорСКомиссионером Тогда
....................
| ВЫБОР
| КОГДА ТаблицаТовары.ДокументОприходования ЕСТЬ НЕ NULL
| ТОГДА ТаблицаТовары.ДокументОприходования
| КОГДА Реквизиты.УказанДокументОтгрузки
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ Реквизиты.Ссылка
| КОНЕЦ КАК Партия,
Функция ТекстЗапросаРасходыУСН(НомераТаблиц, ПараметрыПроведения, Реквизиты)
.........................
Если НЕ ЗначениеЗаполнено(Реквизиты.Сделка) Тогда
.........................
| ВЫБОР
| КОГДА ТаблицаТовары.ДокументОприходования ЕСТЬ НЕ NULL
| ТОГДА ТаблицаТовары.ДокументОприходования
| ИНАЧЕ ТаблицаТовары.Ссылка
| КОНЕЦ КАК Партия,
| ТаблицаТовары.Количество КАК Количество,
.........................
Комплектация товаров
Форма документа: Новая страница "ГруппаКомплекты". Путь к данным заголовка: Объект.Комплекты.КоличествоСтрок
Модуль формы
Процедура УправлениеВидимостью()
Элементы.СпособУчетаНДС.Видимость = Объект.ВидОперации = Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация;
Элементы.ГруппаКомплекты.Видимость = Объект.ВидОперации <> Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация;
Элементы.ГруппаНДС.Видимость = РаздельныйУчетНДС;
Элементы.ГруппаСтраницы.ОтображениеСтраниц = ?(РаздельныйУчетНДС ИЛИ Объект.ВидОперации <> Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация,
ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет);
КонецПроцедуры
Модуль менеджера
Функция ТекстЗапросаВременныеТаблицыДокумента(НомераТаблиц)
// Временная таблица
НомераТаблиц.Вставить("ВременнаяТаблицаКомплектующие", НомераТаблиц.Количество());
НомераТаблиц.Вставить("ВременнаяТаблицаКомплекты", НомераТаблиц.Количество());
ТекстЗапроса =
"ВЫБРАТЬ
| Комплектующие.Ссылка,
| Комплектующие.НомерСтроки,
| Комплектующие.ДоляСтоимости,
| Комплектующие.Количество,
| Комплектующие.Номенклатура,
| Комплектующие.Сумма,
| Комплектующие.СчетУчета,
| Комплектующие.НомерГТД,
| Комплектующие.СтранаПроисхождения,
| Комплектующие.ДокументОприходования,
| Комплектующие.Себестоимость,
| Комплектующие.СпособУчетаНДС КАК СпособУчетаНДСКомплектующей,
| Комплектующие.Ссылка.СпособУчетаНДС КАК СпособУчетаНДСКомплекта
|ПОМЕСТИТЬ ТаблицаКомплектующие
|ИЗ
| Документ.КомплектацияНоменклатуры.Комплектующие КАК Комплектующие
|ГДЕ
| Комплектующие.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Комплекты.Ссылка,
| Комплекты.НомерСтроки,
| Комплекты.Количество,
| Комплекты.Себестоимость,
| Комплекты.ДокументОприходования,
| Комплекты.Ссылка.Номенклатура,
| Комплекты.Ссылка.СпособУчетаНДС КАК СпособУчетаНДСКомплекта
|ПОМЕСТИТЬ ТаблицаКомплекты
|ИЗ
| Документ.КомплектацияНоменклатуры.Комплекты КАК Комплекты
|ГДЕ
| Комплекты.Ссылка = &Ссылка";
Возврат ТекстЗапроса + ОбщегоНазначенияБПВызовСервера.ТекстРазделителяЗапросовПакета();
КонецФункции
Функция ТекстЗапросаСписаниеТоваровРазукомплектация(НомераТаблиц)
НомераТаблиц.Вставить("СписаниеТоваровРазукомплектация", НомераТаблиц.Количество());
НомераТаблиц.Вставить("СписаниеТоваровРазукомплектацияТаблица", НомераТаблиц.Количество());
ТекстЗапроса =
"ВЫБРАТЬ
| Реквизиты.Ссылка КАК Регистратор,
| Реквизиты.Дата КАК Период,
| ""Списание"" КАК ТипСписания,
| ТаблицаКомплекты.НомерСтроки КАК НомерСтроки,
| ВЫБОР
| КОГДА ТаблицаКомплекты.ДокументОприходования ЕСТЬ НЕ NULL
| ТОГДА ТаблицаКомплекты.ДокументОприходования
| ИНАЧЕ Реквизиты.Ссылка
| КОНЕЦ КАК ДокументРеализации,
| Реквизиты.ВидОперации КАК ВидОперации,
| Реквизиты.Организация КАК Организация,
| ЛОЖЬ КАК ДеятельностьНаПатенте,
| Реквизиты.Склад КАК Склад,
| Реквизиты.Склад.ТипСклада КАК ТипСклада,
| НЕОПРЕДЕЛЕНО КАК Контрагент,
| Реквизиты.ПодразделениеОрганизации КАК Подразделение,
| Реквизиты.ПодразделениеОрганизации КАК КорПодразделение,
| ТаблицаКомплекты.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппаКомплекта,
| ТаблицаКомплекты.Количество КАК Количество,
| ТаблицаКомплекты.Себестоимость КАК Себестоимость,
| ""Комплектация"" КАК Содержание
|ИЗ
| ТаблицаКомплекты КАК ТаблицаКомплекты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК Реквизиты
| ПО (&ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКомплектацияНоменклатуры.Разукомплектация))
| И (Реквизиты.Ссылка = &Ссылка)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ""Комплектующие"" КАК ИмяСписка,
| &СинонимКомплектующие КАК СинонимСписка,
| ТаблицаКомплектующие.НомерСтроки КАК НомерСтроки,
| Реквизиты.СчетУчета КАК СчетУчета,
| Реквизиты.Номенклатура КАК Номенклатура,
| Реквизиты.Склад КАК Склад,
| Реквизиты.Дата КАК Период,
| НЕОПРЕДЕЛЕНО КАК ДокументОприходования,
| 0 КАК Себестоимость,
| Реквизиты.ПодразделениеОрганизации КАК КорПодразделение,
| НЕОПРЕДЕЛЕНО КАК Комитент,
| НЕОПРЕДЕЛЕНО КАК ДоговорКомиссии,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка) КАК СчетАвансовСКомитентом,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка) КАК СчетРасчетовСКомитентом,
| НЕОПРЕДЕЛЕНО КАК ВалютаРасчетовСКомитентом,
| 0 КАК СуммаРасчетовСКомитентом,
| ТаблицаКомплектующие.СчетУчета КАК КорСчетСписания,
| ТаблицаКомплектующие.Номенклатура КАК КорСубконто1,
| Реквизиты.Склад КАК КорСубконто2,
| Реквизиты.Ссылка КорСубконто3,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура) КАК ВидКорСубконто1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады) КАК ВидКорСубконто2,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии) КАК ВидКорСубконто3,
| ТаблицаКомплектующие.Количество КАК КоличествоКомплектующих,
| ТаблицаКомплектующие.ДоляСтоимости КАК ДоляСтоимости
|ИЗ
| ТаблицаКомплектующие КАК ТаблицаКомплектующие
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК Реквизиты
| ПО (&ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКомплектацияНоменклатуры.Разукомплектация))
| И (Реквизиты.Ссылка = &Ссылка)
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Возврат ТекстЗапроса + ОбщегоНазначенияБПВызовСервера.ТекстРазделителяЗапросовПакета();
КонецФункции
Функция ПодготовитьТаблицуСписаниеТоваровРазукомплектация(СписаниеТоваровРазукомплектацияТаблица, ТаблицаРеквизиты) Экспорт
//Реквизиты = ТаблицаРеквизиты[0];
//
//ТаблицаСписания = СписаниеТоваровРазукомплектацияТаблица.Скопировать();
//ТаблицаСписания.Колонки.Добавить("Количество", ОбщегоНазначения.ОписаниеТипаЧисло(15, 3));
//
//Если ТаблицаСписания.Количество() = 0
// ИЛИ Реквизиты.Количество = 0
// ИЛИ Реквизиты.ВидОперации <> Перечисления.ВидыОперацийКомплектацияНоменклатуры.Разукомплектация Тогда
// Возврат ТаблицаСписания;
//КонецЕсли;
//
//МассивКоэффициентов = ТаблицаСписания.ВыгрузитьКолонку("ДоляСтоимости");
//
//МассивРезультата = ОбщегоНазначенияБПКлиентСервер.РаспределитьПропорционально(Реквизиты.Количество, МассивКоэффициентов, 3);
//Если МассивРезультата <> Неопределено Тогда
// ТаблицаСписания.ЗагрузитьКолонку(МассивРезультата, "Количество");
//КонецЕсли;
//------------------------------------------------
ТаблицаСписания = СписаниеТоваровРазукомплектацияТаблица.СкопироватьКолонки();
ТаблицаСписания.Колонки.Добавить("Количество", ОбщегоНазначения.ОписаниеТипаЧисло(15, 3));
ВсегоКоличество = ТаблицаРеквизиты.Итог("Количество");
Если СписаниеТоваровРазукомплектацияТаблица.Количество() = 0
ИЛИ ВсегоКоличество = 0
ИЛИ ТаблицаРеквизиты[0].ВидОперации <> Перечисления.ВидыОперацийКомплектацияНоменклатуры.Разукомплектация Тогда
Возврат ТаблицаСписания;
КонецЕсли;
ВсегоСебестоимость = ТаблицаРеквизиты.Итог("Себестоимость"); ОсталосьСебестоимость = ВсегоСебестоимость;
ВсегоДолей = СписаниеТоваровРазукомплектацияТаблица.Итог("ДоляСтоимости");
МассивКоэффициентов = СписаниеТоваровРазукомплектацияТаблица.ВыгрузитьКолонку("ДоляСтоимости");
МассивКомплектующих = СписаниеТоваровРазукомплектацияТаблица.ВыгрузитьКолонку("КоличествоКомплектующих"); МассивКомплектующихОст = МассивКомплектующих;
Для А=1 По ТаблицаРеквизиты.Количество() Цикл
РеквСтр = ТаблицаРеквизиты[А-1];
МассивРезультатаКолво = ОбщегоНазначенияБПКлиентСервер.РаспределитьПропорционально(РеквСтр.Количество, МассивКоэффициентов, 3);
МассивРезультатаСебест = ОбщегоНазначенияБПКлиентСервер.РаспределитьПропорционально(РеквСтр.Себестоимость, МассивКоэффициентов, 2);
Для Ф=1 По СписаниеТоваровРазукомплектацияТаблица.Количество() Цикл
НовСтр = ТаблицаСписания.Добавить();
СущСтр = СписаниеТоваровРазукомплектацияТаблица[Ф-1];
ЗаполнитьЗначенияСвойств(НовСтр, СущСтр);
НовСтр.ДокументОприходования = РеквСтр.ДокументРеализации;
КолвоДетали = МассивКомплектующихОст[Ф-1]; КолвоОстатка = КолвоДетали;
Если А < ТаблицаРеквизиты.Количество() Тогда
КолвоДетали = Окр(МассивКомплектующих[Ф-1] / ВсегоКоличество * РеквСтр.Количество, 3);
КолвоОстатка = КолвоОстатка - КолвоДетали;
МассивКомплектующихОст[Ф-1] = КолвоОстатка;
КонецЕсли;
НовСтр.КоличествоКомплектующих = КолвоДетали;
Если МассивРезультатаКолво <> Неопределено Тогда
НовСтр.Количество = МассивРезультатаКолво[Ф-1];
КонецЕсли;
Если МассивРезультатаСебест <> Неопределено Тогда
НовСтр.Себестоимость = МассивРезультатаСебест[Ф-1];
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ТаблицаСписания;
КонецФункции