Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
18 Июн 2018, 05:05
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Задача №2. Решение и обсуждение.  (Прочитано 4947 раз)

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

Оффлайн progmikon

  • *****
  • Сообщений: 2090
  • РЕПУТАЦИЯ: 371
  • КПД: 18%
  • Регистрация: 2010-10-09
  • Компания: http://progmikon.blogspot.com/
  • Профессия: Программист 1С
Приветствую всех.

Предлагаю разобрать решение второй задачи. (http://forum-1c.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 ведется аналитика и по работникам организации.
Эту доработку я оставляю вам, чтобы сохранить хоть какое-то творческое начало в этих заданиях :).


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

Смотрите бесплатно более 300 видеоуроков по работе в 1С:Бухгалтерия 8 и 1C:ЗУП 8 ред. 3.0

СМОТРЕТЬ >>

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
128 Сообщений
AIFrame AIFrame
118 Сообщений
alexandr_ll
57 Сообщений
alex0402
47 Сообщений
pavl_vs
47 Сообщений
buketov.av buketov.av
40 Сообщений
ilyay ilyay
36 Сообщений
trialex3
24 Сообщений
magnifico61
20 Сообщений
wise wise
15 Сообщений

* Кто онлайн

  • Точка Гостей: 216
  • Точка Скрытых: 0
  • Точка Пользователей: 2
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal