Ссылка на эту мою статью в Дзене: https://dzen.ru/media/elvinto/programmirovanie-1s-urok-3-651673976b0b253b36c13329
Продолжаем изучение программирования 1С. После многих лет программирования и изучения различных программных языков, я пришёл к устойчивому мнению, что изучать эту науку нужно не также как, скажем, математику или физику. Здесь нельзя изучать как русский язык – постепенно от простого алфавита до написания слов и потом предложений. По моему мнению, программирование – это 50% практики и 50% теории, и они должны идти одновременно не опережая друг друга. В программировании тысячи или даже миллионы нюансов, и запомнить их сразу, а потом начать применять – это просто нереально. Здесь, я считаю, нужно не продвижение теории закреплять практикой, а наоборот – для осуществления практических задач “подтягивать” теорию. По этому старайтесь для решения задач не перегружать мозг теорией, которая не поможет вам в решении конкретной задачи, и наоборот – если нужно решить задачу, погрузитесь в теорию её решения достаточно глубоко, чтобы иметь полное представление её осуществления и понимания механизмов её работы. Если копируете код, взятый из интернета, то вы должны понимать всё, что он делает и зачем нужен его тот или иной фрагмент. Это будет хорошим ходом выполнения поставленных задач.
Так что у нас с нашей конфигурацией? Я полагаю, если вы читаете этот текст, то проблем с выполнением домашних заданий с предыдущих уроков у вас не возникло, и это хорошо! На прошлом уроке мы поняли что такой документ 1С и для чего он нужен в общих чертах. Если вы самостоятельно “полазили” по дереву метаданных, то возможно заметили, что сам тип объекта Документа чем-то похож на тип объекта Справочника. Это действительно так, ведь с точки зрения хранения данных – это просто отдельные таблицы так или иначе связанных между собой. Однако, не будем сейчас вникать в суть баз данных, поверьте, хотя документ создан удобно с точке зрения пользователя, и всё делается для этого, то с точки зрения хранения данных он создан не рационально. К документам и справочникам могут быть привязаны табличные части (те, что делали на прошлом уроке), а также к документам можно привязывать справочники (это мы тоже делали, когда выбрали реквизит типа “Справочник.БытоваяТехника”). С точки зрения баз данных такие связи образуют множественные соединения таблиц и это становится нерационально. А ведь как мы знаем с прошлого урока, документы участвуют в формировании хозяйственной деятельности (проводятся), и как следствие, по ним формируются все отчеты. По этому разработчики 1С ещё давным давно выбрали более верный путь. Зачем делать отчеты на основе документов, которые плохо оптимизированы по скорости в момент доступа к данным, когда можно сделать отдельные реестры – простые таблицы с уже подготовленными для отчетности данными, и формировать их в момент проведения документов, а затем уже на основе этих реестров и формировать все необходимые отчеты. Это действительно оптимизирует работу 1С в десятки раз. Зачем загружать систему и сервера одномоментно при каждом формировании того или иного отчета, когда можно эту нагрузку “размыть” по времени и нагружать по чуть-чуть в те моменты, когда пользователь проводит документ. Плюс к этому мы будем в реестрах иметь уже готовы и обработанные данные.
Если подойти ближе к нашей конфигурации, то у нас сейчас уже есть документы учета наших покупок. Как быть, если мы захотим в какой-нибудь времени узнать, сколько у нас дома чего есть на остатках, на какую сумму мы в этом году, квартале сделали покупок и т.д.? Можно конечно перебрать автоматически все документы, “заглянуть” в каждый и на основании этого сделать отчёт, но как я уже только что сказал, этот способ неэффективен и учиться плохому мы не будем. По этому начнём с создания реестра, сделаем правильное его заполнение, а потом я покажу инструменты работы с остатками, которые есть исключительно у этого реестра, но нет у документов. Кстати, по правилам 1С он называется “Регистр”. Причём в 1С есть 4 типа различных регистров:
- Регистры сведений
- Регистры накопления
- Регистры бухгалтерии
- Регистры расчета
Создайте новый реестр накопления, сейчас именно он нам и нужен:
Дайте ему имя “ТоварыНаСкладах”. Хотя у нас конфигурация домашнего бюджета и складов у нас никаких нет, я предлагаю всё же называть так, как это принято в учете фирм и организаций, а мы просто будем адаптировать наш бюджет под эти термины. Ещё заметьте – вид регистра должен быть “Остатки”:
Перейдите во вкладку “Регистраторы” и укажите наш документ (наш документ будет регистрировать записи в этом реестре):
Заметьте, в регистраторах для доступности нет наших справочников, и это понятно, как я говорил ранее, ведь именно документы дают отражение нашей хозяйственной деятельности и регистрируют движения документов. Теперь эту форму можно закрыть. Далее удобнее будет работать с этим регистром из дерева метаданных. Добавьте новое измерение:
Дайте имя “БытоваяТехника” и укажите тип “СправочникСсылка.БытоваяТехника”. Точно также мы делали на прошлом уроке в табличной части документа:
Добавьте два ресурса “Количество” и “Сумма”, типы у них будут тоже аналогичные тому, что у нас в документе:
Кстати, заметьте, есть такое негласное правило, если точность указывается больше нуля, то принято (чтобы не было переполнения в суммах) размер указывать не 10, а 15. На практике, конечно, вряд ли вы будете считать что-то триллионами рублей, но надо стараться делать более универсально, это дело хорошей привычки.
Итак, что мы тут сделали. Мы создали одно измерение и два ресурса. Вообще, с точки зрения базы данных, и то и другое – это просто поля некой таблицы с абсолютно равными возможностями, но 1С их создала таким образом, что измерения более оптимизированы для поиска данных, а ресурсы – для арифметических вычислений.
Теперь нужно что-то сделать для того, чтобы при проведении документа данные попадали в этот регистр. Вернёмся в метаданных к документу “ПоступлениеТоваровУслуг” и кликнем дереве метаданных по нему правой кнопкой. Выберите пункт контекстного меню “Модуль объекта”:
После этого мы оказываемся в окне редактирования кода. Помните на прошлом уроке мы были в модуле формы документа, а это его модуль объекта.
Если говорить более подробно абстрагируясь от 1С, то все формы – это просто массив переменных класса Документ, но у самого класса Документ могут быть свой собственный набор методов.
Иными словами, модуль объекта – это набор процедур и функций общих для каждого экземпляра объекта Документ.ПоступленияТоваровУслуг. Сейчас на примере всё это поймём более подробно.
Добавьте стандартный метод “ОбработкаПроведения”, кликнув по кнопке “Процедуры и функции”:
Появится новая процедура. Добавьте в неё следующий код:
Теперь перезайдите в 1С, откройте документ и проведите его (либо “Провести и закрыть”). Но вот мы смотрим, и вроде ничего не произошло, но на самом деле это не так. Перейдем в функции технического специалиста (если этого пункта нет – см.далее):
Так вот, этого пункта может тут и не быть, т.е. он просто отключен. Если это действительно так, включите его тут:
Вот этот пункт:
Так, далее…Переходим в эти функции, сейчас нам нужно дважды кликнуть по вот этому:
И после этого видим интересную таблицу:
Заметьте, здесь нет цены, зато есть поле регистратора и период. Это и есть реестр, пардон, регистр с нашими подготовленными данными. Он линеен с точки зрения базы данных и оптимизирован внутренними средствами 1С для доступа к нему. Теперь можно по нему формировать отчеты, но о них на следующем уроке, а сейчас мы вернёмся к коду проведения и разберем что же мы тут сделали.
Сначала я автоматически создал процедуру “ОбработкаПроведения”. Эта процедура вызывается средствами 1С в тот момент, когда пользователь нажимает кнопку “Провести” или “Провести и закрыть”.
Далее получаем набор записей регистра ТоварыНаСкладах:
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
, но мы уже наверно догадываемся, что данные там будут со всех проведенных документов ранее или позже, или тех, которых ещё пока нет. По этому нужно как-то отфильтровать, сказать системе 1С, что нужно сейчас обратиться не к данным со всех документов, а именно касаемых нашего документа (он же регистратор):
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Далее в цикле обращаемся к каждой строке нашего документа (делам обращение к табличной части через Объект) и создаём новую запись:
Запись = НаборЗаписей.Добавить();
У каждой записи есть набор свойств, часть из которых как раз наши измерения и ресурсы, но есть и ещё очень важные.
Регистратор – нужно обязательно для нашей записи заполнить. И хотя мы уже отфильтровали набор, запись – это самостоятельный атрибут и её нужно всё равно указать.
Заметьте, что в реквизитах и отборах указывается не Объекты документов, а их ссылки – Объект.Ссылка. Для строки с бытовой техникой мы не указываем, что там ссылка, т.к. она там уже и есть.
Период – тоже нужно обязательно указать – это момент времени, от которого должна быть запись. Для этого я беру дату этого документа, и это понятно, ведь запись в реестре должна быть от той даты, от которой мы совершили сделку по купле этих товаров:
Запись.Период = ЭтотОбъект.Дата;
Заметьте, ЭтотОбъект – это как раз объект нашего конкретного документа. Когда мы будем проводить какой-нибудь другой документ, то ЭтотОбъект будет объектом уже другого документа и брать уже другое значение реквизитов. Т.е. код один, но данные документа разные.
ВидДвижения – это параметр, определяющий в какую строну будет движение ресурсов, в том смысле – от нашей фирмы или к нашей фирме. В данном случае мы вибираем “Приход”, т.к. товары эти поступают к нам, мы их приобретаем, а не продаём:
Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
Вид движения Расход делает противоположное представление – учитывает движение как исходящее от нас.
Всего два варианта выбора Приход и Расход
В движениях по регистру есть одна очень большая особенность, которую нужно понять прямо сейчас – Расход – это НЕ(!) тоже самое, что приход со знаком минус! Приход и расход – это самостоятельные разрезы учета. Говоря иначе:
- Положительное число ресурса в приходе увеличивает остаток этого ресурса по приходу
- Отрицательное число ресурса в приходе уменьшает остаток этого ресурса по приходу
- Положительное число ресурса в расходе увеличивает остаток этого ресурса по расходу
- Отрицательное число ресурса в расходе уменьшает остаток этого ресурса по расходу
- Физический остаток равен приход минус расход
Что это значит на примере.
Мы купили 5 чайников и поставили их +5 в приход
2 чайника продали и поставили +2 в расход
Сколько чайников осталось? Правильно, осталось 3 чайника (приход минус расход) – это физический остаток. Если мы сделаем отчет по такому регистру, то покупки чайников будут определяться только разделом “Приход” и программа не будет считать ту часть таблицы, которая отвечает за расход. Продажи наоборот – это раздел “Расход” и для расчета продаж будет использоваться только эта часть регистра.
Теперь объясняю для чего сделано именно так. Продали-то мы конечно 2 чайника, но вот покупатель посмотрел, а у него брак, и он вернул нам один чайник. Как нам его учесть, чайник-то от него приходит в нашу фирму? Вроде как мы должны учесть как приход, но тогда по итогам расчета получится, что поступило к нам на продажу не 5 чайников, а 6 (ведь как я только что сказал, программа посчитает все приходы, в т.ч. и этот возвратный). Но это не так, это испортит показатель продаж, получится что мы продали 2 товара из 6, а на самом деле только 1 из 5, т.к. 1 нам вернули. По этому давно уже и был придуман этот способ учета. Нам при возврате нужно не увеличивать приход, а уменьшать расход. По этому нам надо будет сделать не +1 в приход, а минус 1 в расход. Тогда будет всё правильно, по итогам получится, что к нам поступило 5 чайников, а ушло – 1. Но один чайник у нас “завис”, он бракованный, и производитель взял на себя ответственность забрать бракованный чайник и вернуть нам за него деньги. По этому действуя аналогично, мы должны не поставить этот чайник в расход, а поставить в минус приход. С точки зрения бухгалтерского учета подобные операции называются сторно. Мы этим самым по учету сделали результат таким, как будто этого инцидента с бракованным чайником никогда в жизни не было, но документальная память об этом останется. У нас будут и документы покупки чайников и их продажи и документы почему мы выполнили приём его от покупателя и возврат поставщику, каждый будет создавать свои движения по регистру. Но по всем отчетам будет так, как и должно быть – если отбросить юридический аспект, то просто купили и продали на 1 чайник меньше. Например, если мы захотим потом сформировать долю проданных товаров от купленных, то она будет верной, и расчет её будет крайне простой. Нам не нужно будет определять какого типа тот или иной документ, мы просто найдём отношение расхода к приходу и не будем вдаваться в подробности почему и как, ведь как я ранее говорил, регистр должен быть таким, чтобы там уже были готовые данные.
Задание по уроку:
1. Сделайте регистр и проведение документов по мелочевке
2. Добавьте в обработки проведения и в регистры измерение, которое бы отражало реквизит документов “Домочадцы”, т.е. регистрировало ещё и того, кто ответственный за этот документ
3. Сделайте новый тип документа “ПродажиТоваров” с табличной частью содержащей бытовую технику. Сделайте при проведении этого документа расход по регистру ТоварыНаСкладах.
Если всё получилось как нужно – молодцы! Если нет, давайте разберёмся что не так.