Подключение к ИС "AITS-Прослеживаемость" для пользователей "Гедымин: Мясокомбинат"

Автоматизация станции технического обслуживания (СТО)

Настоящая статья содержит пример создания простой складской задачи на платформе Гедымин. Выполнять приведенные ниже действия можно как на чистой базе данных, так и на базе, на которой уже установлены типовые решения. Если вы до этого момента не сталкивались с платфорой Гедымин, но хотите начать, рекомендуем воспользоваться дистрибутивом "Гедымин: Разработчик". Данный дистрибутив содержит локальную установку платформы и чистую базу данных с минимум необходимых настроек: локализация, набор базовых функций, данные для наиболее общих справочников системы.

Постановка задачи

Необходимо разработать программу для учета складского движения запчастей. Предполагается следующая структура предприятия:

  • Два склада материалов:
    • Склад запчастей;
    • Склад спецодежды и инструмента.
  • Цех, в котором производится ремонт.

Все товарно-материальные ценности (ТМЦ) разбиты на группы по принадлежности к той или иной марке автомобиля.

Необходимо автоматизировать следующее движение ТМЦ:

  • Поступление на склад;
  • Перемещение в мастерскую и обратно;
  • Продажа запчастей.

Необходимо вести учет ТМЦ в разрезе следующих признаков:

  • Наименования товара;
  • Оригинального номера (шифра комплектующего, единого для всех производителей);
  • Цены покупки;
  • Производителя;
  • Поставщика.

Создание признаков ТМЦ

Первым делом, мы должны определить, какие признаки товара являются постоянными, т.е. не изменяются в процессе его движения, а какие нет. Очевидно, что при каждом поступлении, цена, производитель и поставщик могут варьироваться, в то время как наименование запчасти и ее оригинальный номер будут неизменными. В базе данных постоянные признаки хранятся в справочнике товаров — таблица GD_GOOD. Мы воспользуемся уже существующими в ней полями: NAME для хранения наименования товара и ALIAS для хранения оригинального номера.

Переменные признаки хранятся в карточке ТМЦ — таблица INV_CARD. Добавим в нее три поля:

  • USR$TEST_COSTBUY – Цена покупки;
  • USR$TEST_MANUFACTURER – Производитель;
  • USR$TEST_PROVIDER – Поставщик.

Добавление полей производится следующим образом:

  1. Перейдем в окно Исследователя системы (если оно закрыто, то следует воспользоваться командой "Исследователь", доступной в выпадающем меню "Окна" главного окна Гедымина);
  2. В дереве команд раскроем раздел Сервис, а затем — Аттрибуты;
  3. Вызовем команду "Таблицы";
  4. Отыщем в списке таблицу с именем INV_CARD и установим на нее курсор, как показано на рисунке ниже: Список таблиц
  5. Перейдем в нижнюю часть окна (список полей) и вызовем команду "Добавить поле";

    Команда добавления нового поля

  6. Сначала добавим поле "Покупная цена". Заполним поля диалогового окна так, как показано на рисунке:

    Диалоговое окно редактирования поля

    Для нашего примера мы выбрали префикс TEST, который будем использовать при именовании объектов базы данных, макросов и т.п. рефиксы необходимы для того, чтобы избежать путаницы, когда в базу данных загружено несколько настроек одновременно. Обратите внимание, что при создании поля по нажатию на кнопку "Ок" система автоматически прибавит к его названию еще один префикс — USR$ — признак того, что поле было создано настройщиком, т.н. "Пользовательское поле". Таким образом, результирующее имя поля, которое запишется в базу данных — USR$TEST_COSTBUY. Для задания типа поля мы использовали один из предопределенных доменов — DCURRENCY (тип данных NUMERIC(15, 4)), имеющий локализованное наименование "Сумма". При выборе типа поля из списка можно осуществлять поиск как по названию домена, так и по локализованному наименованию.

    По окончании ввода нажмем кнопку Ок.

    На экране откроется окно, в котором будут показаны SQL команды, выполняемые на сервере для добавления поля в таблицу и создания необходимых триггеров. По завершении, это окно следует закрыть, воспользовавшись соответствующей кнопкой на панели инструментов:

    Список выполненных SQL команд

  7. Далее, добавляем поле "Производитель". Поскольку в системе уже существует справочник клиентов, создадим поле-ссылку на него.

    Вызываем диалоговое окно создания нового поля и вводим данные, как показано на рисунке:

    Создание нового поля

    Закрываем окно создания нового поля по кнопке "Ок". Снова на экране появляется список выполненных SQL команд. Обратите внимание, что на этот раз в строке состояния окна присутствует надпись: "Необходимо переподключение к базе данных!". Она означает, что поле в базу данных физически будет добавлено только после перезагрузки программы. Запоминаем это и закрывем окно.

  8. Аналогично добавляем поле "Поставщик".

    Диалоговое окно создания нового поля

  9. Не забудем закрыть программу и запустить ее снова! Иначе, поля ссылки не будут созданы в базе данных.

    При повторном подключении к базе данных на экран будет выдано сообщение следующего вида:

    Отвечаем "Да" для того, чтобы поля-ссылки были созданы в базе данных.

Создание документов

С признаками мы разобрались. Теперь займемся документами, которые необходимы для регистрации движения ТМЦ. Нам понадобится как минимум три:

  • Приход ТМЦ;
  • Перемещение ТМЦ;
  • Расход ТМЦ.

Документы создаются с помощью команды "Типовые документы", которая находится в Исследователе, в папке "Сервис".

Создание документа "Приход ТМЦ"

Рассмотрим процесс создания документа "Приход ТМЦ".

  1. Выбираем раздел "Складские документы" и добавляем новый складской документ.

  2. На экране откроется диалоговое окно:

    Заполним поля, как показано на рисунке. Если вы выполняете данное задание на чистой базе данных, то ветки Исследователя с наименованием "Складской учет" у вас скорее всего не будет. В этом случае, после заполнения поля "Ветка для вызова команд", на экране появится окно с предложением создать новый объект. Отвечаем согласием и, затем, подтверждаем создание новой ветки нажатием кнопки "Ок" в появившемся диалоговом окне.

    При создании нового складского документа важно правильно указать его шаблон. Всего существует четыре шаблона, которые различаются работой с карточкой ТМЦ и принципом формирования движения. Рассмотрим их более подробно:

    • Обычный складской документ – работает с одной карточкой. Документ такого типа может либо просто перемещать товар, либо регистрировать новое поступление товара. Рекомендуется использовать только для приходных документов. Создает минимум две записи в таблице INV_MOVEMENT на каждую товарную позицию документа (откуда пришел товар и куда ушел).
    • Документ с изменением свойств ТМЦ – работает с двумя карточками – карточка, которая определяет состояние ТМЦ до совершения движения, и карточка — после. Если в процессе движения никакие свойства не менялись, — эти карточки совпадают, если менялись, то документ создает новую карточку. На каждую товарную позицию в документе создает как минимум две записи в таблице INV_MOVEMENT.
    • Инвентаризационный документ – данный шаблон применяется для документов инвентаризации. Создает только одну запись в таблице INV_MOVEMENT.
    • Документ трансформации ТМЦ – шаблон предназначен для создания документов комплектации, производства, а так же сложных документов, состоящих из двух частей – в одной части регистрируется новое, произведенное ТМЦ, а в другой — списываются товары, пошедшие на его изготовление. На каждую товарную позицию документа формируется 1 позиция движения.

    Для рассматриваемого нами документа устанавливаем шаблон "Обычный складской документ".

  3. Далее, необходимо создать таблицы для шапки документа и для товарных позиций. Таблицы для документа должны создаваться обязательно из диалогового окна создания нового документа! Использовать таблицы, созданные из других разделов программы нельзя.Создаем таблицу шапки документа. Для этого следует установить курсор в поле "Таблица шапки документа" и нажать клавишу F2.
  4. На экране появится соответствующее диалоговое окно:

    Обратите внимание, что в соответствующие поля были автоматически перенесены значения из диалогового окна создания нового типового документа.

  5. Перейдем на вкладку "Поля" и добавим два поля: Поставщик и Склад. С первым полем все достаточно просто. Это ссылка на таблицу GD_CONTACT. Соответствующий тип поля имеет наименование "Клиент". С добавлением поля такого типа мы уже сталкивались выше при определении признаков.

    Несколько сложнее обстоит дело с добавлением поля "Склад". Если вы выполняете данный пример на чистой базе данных с минимумом загруженных настроек, то нужного нам типа в списке не будет и нам придется создать его самостоятельно.

    Заполняем поля диалогового окна, как показано на рисунке ниже. После ввода в поле "Тип поля" строки "Склад (Тест)" нажимаем клавишу F2.

    На экране откроется диалоговое окно создания нового типа поля, которое содержит три вкладки. Заполним поля на вкладке "Общие" данными, как показано на рисунке.

    Обратите внимание, что префикс имени типа мы указали не TEST_, а TEST_D. Это вовсе не опечатка. Так, с помощью буквы D, мы помечаем все типы данных (домены).

    Переходим на вторую вкладку, "Тип данных", и выбираем из предложенного списка тип "Ссылка".

    Заполняем поля значениями, как показано на рисунке:

    • В поле "Ссылка на таблицу" вводим GD_CONTACT или ее локализованное наименование — Контакты;
    • Из выпадающего списка "Поле таблицы для отображения" выбираем поле NAME (Наименование);
    • И, наконец, поскольку нас интересуют только те записи из справочника, которые имеют тип "Производственное подразделение", мы указываем соответствующее условие отбора: "contacttype=4".

    Остается перейти на вкладку "Визуальные" и из выпадающего списка "Бизнес-класс" выбрать тип "Подразделение".

    Сохраняем созданный нами тип данных, затем поле и, наконец, таблицу.

  6. Заметим, что система самостоятельно снабдит наш документ следующими полями:
    • Номер документа;
    • Дата документа;
    • Автор документа;
    • Дата и время создания документа;
    • Кто последним изменял документ;
    • Дата и время изменения документа;
    • Типовая операция, связанная с документом.
  7. Итак, мы все еще находимся в окне создания нового складского документа. Следующее наше действие — перейти в поле "Таблица позиции документа" и создать в базе данных таблицу для хранения товарных позиций.

    Снова воспользуемся клавишей F2. В таблице позиций самостоятельно создаем только одно поле: Сумма (USR$SUM), тип данных DCURRENCY. Остальные поля, такие как:

    • Наименование ТМЦ (GOODNAME);
    • Шифр ТМЦ (ALIAS);
    • Количество (QUANTITY).
    уже созданы для нас системой.
  8. Сохраняем таблицу позиций и переходим на вкладку "Признаки".

    Удостоверимся, что установлен переключатель "Признаки новой карточки" и с помощью кнопки ">>" перенесем все признаки в правую часть окна, в список "Выбранные признаки".

  9. Переходим на вкладку "Приход". Указываем куда оформляется приход, на "Подразделение нашей компании", и где находится соответствующая информация — поле "Склад (USR$DEPOT)"в таблице шапки документа.

  10. Далее, переходим на вкладку "Расход". Аналогично предыдущему указываем откуда оформляется расход и какое поле отвечает за хранение необходимой информации:

    В нашем случае товар уходит от поставщика. Поставщик – это клиент и поле, которое отвечает за хранение ссылки, USR$PROVIDER.

  11. Переходим на вкладку "Справочники". Здесь мы должны указать, откуда пользователь будет выбирать товары в накладную. Это может быть справочник ТМЦ (если документ регистрирует новое поступление) или остатки ТМЦ, если документ работает с уже зарегистрированным ранее товаром.

    В нашем документе товары выбираются из справочника о чем свидетельствует установленный флаг "Использовать справочник ТМЦ". Флаг "Документ может быть отложенным" означает, что мы можем осуществлять предварительное формирование документа, т.е. все данные документа будут сохранены в базе, но складское движение сформировано не будет.

  12. На этом, первая часть создания нового складского документа может считаться завершенной. Нажимаем "Ок" и затем переподключаемся к базе данных (выходим из программы и заходим в нее снова).

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

  • Рассчитывать сумму по позиции при изменении цены и количества и записывать ее в поле USR$SUM;
  • Заполнять поле Поставщик в позиции документа соответствующим значением из шапки.

Перекрытие метода DoFieldChange

Для расчета суммы следует перекрыть метод DoFieldChange в бизнес-классе нашего документа. Но прежде нам придется узнать его РУИД (RUID). Вернемся в список типовых документов и установим курсор на позицию "Приход ТМЦ". Напомним, что так мы назвали созданный нами складской документ. Нажмем правую кнопку мыши и выберем команду "Свойства".

Как видно на рисунке, в появившемся диалоговом окне мы сможем узнать RUID нашего типового документа. Запомним или запишем его. Закроем окно со свойствами.

Код программы создается в редакторе скрипт-объектов, который вызывается одноименной командой из меню "Сервис" главного окна Гедымина.

Выполняем следующие действия:

  1. Убедимся, что в выпадающем списке, в верхней части Проводника выбран модуль "Application" (если проводник скрыт, вызовем его на экран с помощью команды "Проводник" из меню "Окна");
  2. В дереве Проводника последовательно откроем папку "Методы", затем "TgdcBase", затем "TgdcTree", затем "TgdcDocument", затем "TgdcInvDocumentLine+RUID". Обратите внимание! Что выполняя данный пример, вы должны заменить +RUID в последнем наименовании на РУИД вашего типового документа, который мы определил и запомнили выше.
  3. В списке методов, доступных для перекрытия отыщем DoFieldChange и откроем его двойным щелчком мыши;
  4. В правой части окна перейдем на вкладку "Скрипт" и к сгенерированному системой коду добавим свой:
option explicit
sub TgdcInvDocumentLine+RUID+DoFieldChange(Self, Field)
'*** Данный код необходим для вызова кода определенного в gdc-классе.***
'*** При его удаления  возможно нарушение  правильной работы системы.***
  call Inherited(Self, "DoFieldChange", Array(Self, Field))
'***               Конец кода поддержки gdc-класса.                  ***
' проверяем какое поле было изменено
  select case UCASE(Field.FieldName)
    case "TO_USR$TEST_COSTBUY", "QUANTITY"
' если изменено поля цена или количество, то рассчитываем сумму.
      Self.FieldByName("USR$SUM").AsCurrency = _
        Sef.FieldByName("TO_USR$TEST_COSTBUY").AsCurrency * _
        Sef.FieldByName("QUANTITY").AsCurrency
  end select
end sub

Метод DoFieldChange вызывается при изменении любого поля, в него передается объект который изменяется и поле, которое было изменено.

Следует обратить внимание на правило именования полей-признаков. Если эти поля были добавлены как признаки новой карточки, то к названию поля добавляется префикс TO_, если как признаки существующей карточки, то префикс FROM_.

Перекрытие метода DoBeforePost

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

option explicit
sub TgdcInvDocumentLine+RUID+DoBeforePost(Self)
'*** Данный код необходим для вызова кода определенного в gdc-классе.***
'*** При его удаления  возможно нарушение  правильной работы системы.***
  call Inherited(Self, "DoBeforePost", Array(Self))
'***               Конец кода поддержки gdc-класса.                  ***
' Проверяем наличие мастера (позиция может обрабатываться отдельно от 'мастера)
  if Assigned(Self.MasterSource) then
    if Assigned(Self.MasterSource.DataSet) then
      Self.FieldByName("TO_USR$TEST_PROVIDER").AsInteger = _
        Self.MasterSource.DataSet("USR$PROVIDER").AsInteger
    end if
  end if
end sub

Обработка изменения поставщика в шапке документа

Для надежности, надо обрабатывать еще и изменение поставщика после ввода позиций. Для этого нам необходимо перекрыть метод DoFieldChange в шапке документа, т.е. в классе TgdcInvDocument. Находим в дереве класс TgdcInvDocument+RUID и перекрываем метод. Прописываем следующий код:

option explicit
sub TgdcInvDocument+RUID+DoFieldChange(Self, Field)
'*** Данный код необходим для вызова кода определенного в gdc-классе.***
'*** При его удаления  возможно нарушение  правильной работы системы.***
  call Inherited(Self, "DoFieldChange", Array(Self, Field))
'***               Конец кода поддержки gdc-класса.                  ***
  select case UCase(Field.FieldName)
    case "USR$PROVIDER"
      for i = 0 to Self.DetailLinksCount - 1
        if UCASE(Self.DetailLinks(i).ClassName) = "TGDCINVDOCUMENTLINE" then
          Self.DetailLinks(i).First
          while not Self.DetailLinks(i).EOF
            Self.DetailLinks(i).Edit
            Self.DetailLinks(i).FieldByName("TO_USR$TEST_PROVIDER").AsInteger = _
              Self.FieldByName("USR$POVIDER").AsInteger
            Self.DetailLinks(i).Post
            Self.DetailLinks(i).Next
          wend
        end if
      next
  end select
end sub

Последние штрихи

Итак, процесс создания нового типового документа завершен. Найдем в Исследователе системы ветку "Складской учет" (если вы не забыли, мы создали ее в процессе создания типового документа) и вызовем из нее команду "Приход ТМЦ". На экране откроется форма просмотра приходных документов. По команде "Добавить" на экране откроется диалоговое окно создания нового документа:

Как видно на приведенном скриншоте у Гедымина свои понятия о красоте, если они несколько расходятся с вашими, то внешний вид формы легко исправить, если перевести ее в режим дизайнера с помощью коомбинации клавиш Ctrl+Alt+E.

Создание остальных документов

Расходный документ и документ перемещения создаются аналогично и мы предоставляем читателю возможность самостоятельно поупражняться в этом деле. Ниже приведены небольшие подсказки:

  • Следует выбрать шаблон документа "Документ с изменениями свойств ТМЦ";
  • На вкладке "Признаки" необходимо указать признаки и новой и существующей карточки. Т.е. сначала установить переключатель в позицию "Признаки новой карточки" и выбрать признаки из списка, затем, — в позицию "Признаки существующей карточки" и опять же выбрать признаки из придложенного списка. В нашем случае, не существует признаков, которые бы меняли наши документы, поэтому признаков новой карточки у нас не будет, а в признаках существующей карточки мы укажем производителя и цену покупки;
  • Для расходного документа, на вкладке "Приход" указываем "Клиент" и выбираем соответствующее поле. Для документа "Перемещение" указываем "подразделение нашей компании";
  • На вкладке "Расход" для обоих документов указываем "подразделение нашей компании";
  • На вкладке "Справочник" выбираем "Использовать справочник остатков ТМЦ", устанавливаем флаг "Осуществлять контроль остатков";
  • Методы документов перекрываются по аналогии;
  • Для документа расхода (продажи), в общем случае, следует добавить в карточку ТМЦ поле Цена отпуска (USR$TEST_COSTSELL) и использовать ее как признак новой, хотя, в частном случае, цену отпуска можно добавить просто полем в таблице позиция документа.

Михаил Шойхет