Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 10:48

Задача №2. Решение и обсуждение.

Автор progmikon, 07 янв 2011, 17:34

0 Пользователей и 1 гость просматривают эту тему.

progmikon

Приветствую всех.

Предлагаю разобрать решение второй задачи. (https://forum-baza.ru/index.php?topic=5608.0)
Оно безусловно не единственно возможное, но такое решение выбрал я.

Адекватная критика, замечания, дополнения - приветствуются. Пишите или в личку, или просто оставляйте сообщения в этой теме.

Итак, начнем.

Чтобы не переключаться с одной темы на другую, продублирую условие задачи здесь:
"Необходимо организовать возможность заполнения документа "Инвентаризация товаров на складе" по счетам МЦ (по любому конкретному или по всем счетам МЦ)".

Теперь давайте поговорим немного о реализации данной задачи. Первое, что может прийти в голову - создать отчет. Такой подход имеет место быть, но хотелось бы хранить неприкосновенно, данные прошлых инвентаризаций, посему мы будем действовать через документ. Следующий вопрос: а какой документ нам поможет в этом? Создавать отдельный документ нет необходимости, поскольку прототип у нас уже есть в конфигурации "Бухгалтерия предприятия" - "Инвентаризация товаров на складах".  Кроме того, создавать с нуля печатные формы, типа "ИНВ-3", "ИНВ-19", лениво. "Ломать" сам типовой документ мы не будем, а воспользуемся замечательным механизмом "внешняя обработка табличных частей".

Для начала предлагаю вспомнить, что нам нужно, чтобы заставить обычную обработку работать как "заполнятель" :) табличных частей документа.
Да вобщем-то совсем не много - в модуле объекта нашей обработки описать процедуру:

Процедура Инициализировать(Документ, ИмяТабЧасти, ТабличноеПоле) Экспорт

Итак, приступим к кодингу.
Сразу хочу сказать, что ряд моментов сделан не самым оптимальным образом,  сделано это с той целью, чтобы код выглядел максимально ясно.

Давайте сразу определимся, откуда мы будем брать интересующие нас данные. Я предлагаю из регистра бухгалтерии "Хозрасчетный". То есть по факту - данные по проводкам. Почему? Потому что, по опыту могу сказать, что бухгалтера очень часто делают проводки (по тем или иным причинам) с помощью "ручных проводок (Документ "ОперацияБух")" и о корректировке записей регистров мало что слышали :). Надеюсь, я вас убедил? :). В качестве виртуальной таблицы данного регистра мы будем использовать таблицу "Остатки".
Собственно, сам текст нашего запроса:

ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК СчетУчетаБУ,
ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) КАК Сумма,
ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) КАК СуммаУчет,
ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК Количество,
ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК КоличествоМест,
ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК КоличествоУчет,
ХозрасчетныйОстатки.Субконто1.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения,
1 КАК Коэффициент,
ВЫБОР
КОГДА ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) = 0
ТОГДА 0
ИНАЧЕ ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) / ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0)
КОНЕЦ КАК Цена
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет В (&МассивСчетов), , Организация = &Организация) КАК ХозрасчетныйОстатки

Имена полей и их состав я выбрал так, чтобы они полностью совпадали с именами колонок табличной части документа "Инвентаризация товаров на складах" - "Товары".
Что касается параметров данного запроса, то они очевидны из условия:
"Организация" - заполняется из документа;
"НаДату" - дата, на которую получаем остатки (берем из даты документа);
"МассивСчетов" - массив счетов, набор которых, согласно условию задачи, пользователь должен выбрать сам.

Как реализовать последний пункт? Я предлагаю выводить пользователю на форме список субсчетов счета МЦ, а он уж пускай сам выбирает, что ему нужно.
Добавляем новую форму для нашей обработки. На форме размещаем табличное поле с именем "ТаблицаСчетов". Это поле будет иметь две колонки:
"Обрабатываем" - "Булево". В этом поле пользователь будет "галочками" проставлять счета, которые ему интересны.
"СчетУчета" - "ПланСчетовСсылка.Хозрасчетный", собственно счета.

Теперь для связи нашей процедуры "Инициализировать" с новой формой, сделаем ее модальное открытие:

МассивСчетов = ПолучитьФорму("Форма").ОткрытьМодально();

Почему именно модально? Потому, что при закрытии этой формы, мы можем передать параметр закрытия.

Чтобы пользователю не пришлось добавлять счета, давайте заполним их при открытии формы:

Процедура ПриОткрытии()
ТаблицаСчетов.Очистить();
Запрос = Новый Запрос("ВЫБРАТЬ
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериальныеЦенностиВЭксплуатации)");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаСчетов.Добавить();
НоваяСтрока.Обрабатываем = Истина;
НоваяСтрока.СчетУчета = Выборка.Ссылка;
КонецЦикла;
КонецПроцедуры

Теперь при открытии формы, все нужные для данного случая счета, будут уже заполнены.
На форме я оствил только одну кнопку - "Выполнить". Вот код обработчика:

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

В данном куске кода мы создаем массив счетов, которые отмечены пользователем и передаем их в наш модуль объекта.
По большому счету - все.
Модуль объекта:

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

Осталось подключить нашу обработку в базу.

Хочу заметить, что в данном задании не говорилось про отбор по ответственному лицу, а например, для счетов МЦ.02, МЦ.04 ведется аналитика и по работникам организации.
Эту доработку я оставляю вам, чтобы сохранить хоть какое-то творческое начало в этих заданиях :).

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск