2.12
Хранение данных по взаиморасчетам с контрагентами
Вернемся к
нашим контрагентам. С ними мы будем вести разные торговые операции,
и, соответственно, будем платить поставщикам за отгруженный товар,
а от покупателей получать деньги за проданный. Для ввода данных
по хозяйственным операциям в 1С служит такой объект метаданных как
"Документ". Документами мы сможем вводить данные по приходу/перемещению/отгрузу
товара, приходу/расходу денег, но хранить текущее состояние остатков
на складе и состояние взаимозадолженности с контрагентами в документах
нельзя. Можно эту информацию хранить в справочнике, если добавить
соответствующие поля, но это крайне неэффективно и не удобно. Для
такой цели в 1С есть специальный механизм. Этот механизм использует
объект метаданных "Регистр" – в оперативном учете (для Бухгалтерии
– "ПланСчетов", для Расчета – "Журнал расчетов"). Мы занимаемся
изучением компоненты "Оперативный учет" и поэтому будем пользоваться
именно "Регистрами".
Как устроен
регистр. При его создании фирма 1С использовала некоторые положения
технологии OLAP. Вот, к примеру, ссылка с неплохим объяснением,
что это такое (http://www.permonline.ru/~enter/june/olap.htm).
Там много текста, картинок и все вполне доходчиво. Есть и другие
подобные материалы. Описание регистра 1С хорошо посмотреть в КиА
том 1.
Регистры бывают
двух типов. Регистр остатков и регистр оборотов. Их суть и различия
можно проиллюстрировать следующим примером. Представим себе прямую
направляющую по которой движется бегунок. На бегунок установлен
спидометр с указателем пройденного пути. Мы измеряем расстояние
от конца направляющей до бегунка. Бегунок идет вперед – это расстояние
растет, идет назад – уменьшается. Так действует регистр остатков.
Он показывает текущее состояние координаты бегунка по отношению
к какому-то нулевому значению. Аналог – остатки на складе. Они растут,
если был приход товара, и уменьшаются, если был расход. У нас есть
еще спидометр со счетчиком пройденного пути. В какую бы сторону
бегунок не двигался – цифра на счетчике растет. Так действует регистр
оборотов. Аналог – величина товарооборота в магазине. Есть ли приход,
или расход – товарооборот растет.
Сконструируем
сперва регистр взаиморасчетов. У него будет только два измерения:
"Контрагент" и "Договор" и один ресурс: "Сумма". Регистр у нас будет
типа регистр остатков. Если сумма будет меньше нуля – контрагент
должен нам, если больше – мы должны контрагенту. Реквизит заведем
один "ФлагДвижения" – типа число и будет принимать следующие значения
при изменении состояния регистра:
1 – изменение долга за поставленный нам товар;
2 – изменение долга за проданный нами товар;
3 – изменение долга оплатой за поставленный нам товар;
4 – изменение долга оплатой за проданный нами товар;
Идентификатор:
Взаиморасчеты
Тип: Остатки
Периодичность: - |
Измерения
|
Идентификатор
|
Комментарий
|
Тип
значения |
Дополнительно
|
Контрагент
|
с
кем мы ведем дела |
С.Контрагенты
|
Д
|
Договор
|
по
какому договору |
С.Договора
|
Д,
И |
Ресурсы
|
Идентификатор
|
Комментарий
|
Тип
значения |
Дополнительно
|
Сумма
|
Сумма
долга |
Число
15.2 |
|
Реквизиты
|
Идентификатор
|
Комментарий
|
Тип
значения |
Дополнительно
|
ФлагДвижения
|
тип
движения |
Число
1.0 |
+
|
Здесь:
Д – отбор движений;
И – отбор итогов;
+ - не отрицательный;
Движения по
регистру будут следующие:
Приход – приход к нам товара (общей суммой) либо денег;
Расход – отгруз нами товара (общей суммой) либо выплата денег.
Переходим к
конструированию регистра.
- Создаем новый
регистр;
- Идентификатор
- "Взаиморасчеты", Комментарий – "регистр взаиморасчетов с контрагентами",
Измерения, ресурсы, реквизиты – по таблице, Тип регистра – остатки,
быстрая обработка движений – по желанию;
2.13
Первый документ. Приход денег.
У нас есть
контрагенты и договора с ними, у нас есть место (регистр), где мы
можем хранить информацию по взаиморасчетам с ними. Теперь нам нужен
документ, который позволит вводить эти взаиморасчеты. Первым нашим
документом будет документ "Приход денег".
В любом документе
в 1С есть два поля, присутствующих всегда. Это "ДатаДок" – дата
документа и "НомерДок" – номер документа. 1С позволяет завести еще
сколько надо полей, которые будут присутствовать во всех документах.
Это "Общие реквизиты" документа. Заведем один такой общий реквизит
– "Комментарий" текстового типа длиной не более 100 символов. Назначение
его ясно из названия.
- Входим в
ветвь "Документы" дерева метаданных;
- Устанавливаем
курсор на раздел "Общие реквизиты";
- Вводим новый
общий реквизит;
- Идентификатор
– "Комментарий", тип – Строка, длина – 100;
Обговорим теперь структуру нашего документа "Приход денег". Кроме
полей с датой, номером и комментарием нам, разумеется, понадобится
указание – кто нам эти деньги платит? – "Контрагент", на каком основании
он платит нам эти деньги? – "Договор", сколько денег он нам платит?
– "Сумма". Типы полей "Контрагент" и "Договор" - соответствующие
справочники. Поле "Сумма" будет у нас Число 9.2. Создадим этот документ.
- Вводим новый
документ;
- Идентификатор
– "ПриходДенег", Синоним – "Приход денег", Комментарий – "приход
денег от контрагента";
- Документ
будет проводиться – да, при записи документ будет перепроводиться
– да;
Здесь необходимо дать пояснение, что такое проведение документа.
Проведение документа – это внесение соответствующих изменений в
механизмы хранения данных (в регистры, планы счетов, журналы расчетов).
Документ, у которого стоит указание на возможность проведения, может
находиться в трех состояниях – не существует (наиболее частое),
записан – данные сохранены, проведен – данные сохранены и учтены
в механизме хранения данных (если этот механизм не указан, документ
все равно считается проведенным) – т. е. совершил какое-то движение
в учете.
- Документ
будет принадлежать журналу – да, Создать новый журнал – "ДвижениеДенег";
Журнал – список документов определенного/определенных видов. Имеет
экранную форму.
- И документ
и журнал вставим в экранное меню;
- Открылось
окно свойств документа;
- В перечень
реквизитов шапки занесем наши реквизиты – "Контрагент", "Договор",
"Сумма". Табличной (многострочной) части в этом документе нет;
- Нумератор
– не назначен, Периодичность – год;
Периодичность – это как часто будет появляться документ с номером
1.
- Автоматическая
нумерация строк – нет (у нас строк не будет);
- Оперативный
учет – ДА;
Этим мы покажем, что движение осуществляется по регистрам.
- Создадим
форму документа;
- Вставим поле
с текстом, где мы укажем название документа;
- Расставим
элементы экранной формы документа поудобнее;
- В свойствах
поля договор на закладке "Дополнительно" в поле "связан с" пишем
"Контрагент";

Справочник "Договора" у нас подчиненный, и мы в форме документа
указываем, что договора мы будем брать, принадлежащие ранее указанному
контрагенту.
- Мы желаем,
чтобы при выборе другого контрагента, поле договор очищалось;
- В свойствах
поля ввода "Контрагент" на закладке "Дополнительно" пишем формулу
Контрагент();
- В модуле
формы пишем следующую процедуру:
Перем СтКонтрагент;
// Это мы добавили переменную, область
действия которой
// весь модуль формы документа
//-----------------------------------------------
Процедура ПриОткрытии()
// Это предопределенная процедура, запускается
при возникновении
// события – открытие формы документа
// Она сформировалась автоматически, как мы указали в визарде создания
// документов
  ПриЗаписиПерепроводить(1);
// Это означает, что если мы проведенный
документ изменили, то при
// попытке его сохранения программа попытается его перепровести
  СтКонтрагент=Контрагент;
// Инициализируем переменную СтКонтрагент
значением реквизита Контрагент
КонецПроцедуры
//-----------------------------------------------
Процедура Контрагент()
  Если Контрагент<>СтКонтрагент Тогда
// В поле Контрагент содержимое изменилось
    Договор="";
// Очищаем поле Договор
    СтКонтрагент=Контрагент;
// Инициализируем переменную СтКонтрагент
новым значением
// реквизита Контрагент
  КонецЕсли;
КонецПроцедуры
- Закроем форму;
- Откроем Модуль
документа;
- Мы видим
текст:
// ********************
Процедура ОбработкаПроведения()
//Здесь следует написать алгоритм проведения
документа
КонецПроцедуры
Модуль документа служит для задания правил внесения изменений в
механизмы хранения данных.
- Перепишем
процедуру ОбработкаПроведения:
Процедура ОбработкаПроведения()
// Предопределенная процедура, запускающая
механизмы регистрации движений
  Если Контрагент.Выбран()=0 Тогда
// Выбран() – метод, возвращающий состояние
поля ввода = 1, если поле
// заполнено и 0 если нет
    Предупреждение("Контрагент не
выбран");
// Вызовем на экран информационное окно
с сообщением
    НеПроводитьДокумент();
// Указываем, что документ заполнен
неправильно – он не должен быть проведен
  КонецЕсли;
  Если Договор.Выбран()=0 Тогда
    Предупреждение("Договор не выбран");
    НеПроводитьДокумент();
  КонецЕсли;
  Если Договор.ДатаДоговора>ДатаДок Тогда
// Договор еще не был заключен на дату
документа
    Предупреждение("Неверная дата
договора");
    НеПроводитьДокумент();
  КонецЕсли;
// Теперь будем заполнять поля регистра
"Взаиморасчеты"
  Регистр.Взаиморасчеты.Контрагент =
Контрагент;
  Регистр.Взаиморасчеты.Договор = Договор;
  Регистр.Взаиморасчеты.Сумма = Сумма;
// Движение – поступление денег за продаваемый
нами товар
// ФлагДвижения = 4
  Регистр.Взаиморасчеты.ФлагДвижения
= 4;
// Наш долг возрос, либо долг контрагента
уменьшился – на регистр
// пишем сумму приходом
  Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
КонецПроцедуры
- Закрываем
модуль документа;
- Закроем окно
свойств документа;
- Переходим
к редактированию журнала. Находим журнал "ДвижениеДенег";
- Входим в
редактирование журнала;
- Добавим новую
графу;
- Идентификатор
– "Сумма";
- В возможных
значениях отметим Документ.ПриходДенег.Шапка.Сумма;
- В выбранных
значениях появилось указание на поле документа "Приход денег"
"Сумма";
- Входим в
форму списка журнала;
- Разместим
графы журнала как будет удобнее, и поменяем им ширину, чтобы все
было видно;
- Закроем форму
списка журнала и окно свойств журнала;
- Сохраним
конфигурацию;
2.14
Работа с документом.
Документ готов.
Проверим его в работе.
- Открываем
1С:Предприятие в монопольном режиме;
- Через меню
"Операции" команда "Управление оперативными итогами";
- Ставим дату
актуальности итогов на 01.10.2000;
- Нажимаем
[Установить];
- Появился
вопрос "Изменить Точку Актуальности итогов";
- Отвечаем
[Да];
- Нам сообщают,
что изменение точки актуальности завершено. Подтверждаем получение
сообщения (подробнее см. "Руководство пользователя");
- Выходим из
окна управления итогами;
- Из нового
раздела меню "Документы" вызываем документ приход денег;
- Номер документа
– 1, Дата – 02.10.2000, Комментарий – "наш первый документ", Контрагент
– "Винни-Пух и все все все", Договор – "№12 от 2 Октября 2000
г.", Сумма – 1000;
- [Закрыть];
- Нас спросят
– сохранить ли документ? [Да];
- Попросят
указать время – в начало дня;
- Входим в
меню "Журналы". Выберем журнал "ДвижениеДенег";
- Если мы в
журнале ничего не видим, значит, у нас стоит не тот период просмотра
журнала. Входим в меню Действия, команда "Интервал". Устанавливаем
диапазон дат от 01.10.2000 до текущей даты;
- Мы видим
наш документ. Пиктограммка слева – голубенький листок бумажки.
Это значит, что документ сохранен;
- Откроем этот
документ, дважды щелкнув его мышкой;
- Теперь нажмем
[ОК];
- Нас спросят
про сохранение документа – [Да];
- Провести
документ? – [Да];
- Точка актуальности
будет перенесена на новую дату. Продолжить? – [Да];
Нами точка Актуальности была выставлена на 01.10.2000, а документ
от 02.10.2000 – точка актуальности перемещается на последний проведенный
документ.
- В журнале
пиктограммка приобрела красную галочку – флаг проведения документа,
и красную черточку внизу – признак того, что ТА (Точка Актуальности
стоит на текущем документе);
- Посмотрим,
какие движения произвел наш документ;
- Курсор на
документ. Меню "Действия", команда "Движения документа". Появилось
окошко. В нем галочка стоит на строке с надписью Взаиморасчеты
– это означает, что движение было только по этому регистру;
Тут есть еще строчка – Реквизиты справочников. Документ при проведении
может менять значения периодических реквизитов справочников! (Если,
конечно, это прописать в процедуре ОбработкаПроведения).
- Выбираем
эту строку;
- Появилось
окно "Движения регистров Взаиморасчеты (Приход денег 1 (02.10.2000))";
- Видим в списке
движений одну строку со знаком плюс (+) – это был приход. Движение
было только одно – как мы и написали;
- Закроем 1С:Предприятие;
2.15
Отчет по долгам.
Мы теперь,
по данным нашей программы, должны фирме "Винни-Пух и все все все"
– 1000 ед. денег. Это мы можем определить из нашего единственного
документа, но когда таких документов будет много, и контрагентов
в документах будет тоже много, мы запутаемся. Пусть лучше машина
сама показывает нам кто, кому, по какому договору и сколько должен.
Для таких целей существуют отчеты. Простейший отчет – "список номенклатуры"
– мы уже создавали. Этот отчет у нас был включен в форму списка
справочника. Теперь мы создадим отчет, имеющий свою отдельную форму.
- В дереве
метаданных, в разделе отчеты, создаем новый отчет;
- Идентификатор
– "Взаиморасчеты";
- А вот вставлять
в интерфейс из визарда не будем. Мы потом сами ручками вставим;
- Конструкторы
никакие вызывать не будем – так напишем (либо скопируем с сей
методички);
- Появилась
экранная форма отчета;
- Добавим поле
ввода. Идентификатор – ВыбДата, тип – дата;
- В модуле
формы пишем:
Процедура Сформировать()
  Запрос=СоздатьОбъект("Запрос");
// Запрос – специальный объект в 1С,
служит для получения структурированной
// выборки данных
  ТЗ="
  |Период с ВыбДата по ВыбДата;
  |Контр = Регистр.Взаиморасчеты.Контрагент;
  |Дог = Регистр.Взаиморасчеты.Договор;
  |Сум = Регистр.Взаиморасчеты.Сумма;
  |Функция СумКонОст = КонОст(Сум);
  |Группировка Контр упорядочить по Контр.Код;
  |";
// Это текст запроса. Подробности
в "Описании языка" том 2
  Если Запрос.Выполнить(ТЗ)=0 Тогда
    Сообщить("Запрос не выполнен");
    Возврат;
  КонецЕсли;
// Если запрос будет не выполнен по
какой либо причине, метод Выполнить()
// вернет 0. Мы сообщим пользователю о произошедшей ошибке, и
// командой Возврат – прервем выполнение процедуры
  ИтогоМы=0;
  ИтогоНам=0;
// В этих двух переменных мы будем хранить
итоговую информацию по долгу
  Таб=СоздатьОбъект("Таблица");
  Таб.ИсходнаяТаблица("");
  Таб.ВывестиСекцию("Шапка");
  Пока Запрос.Группировка("Контр")=1 Цикл
// Получаем очередную запись из запроса
    ТЭ=Запрос.Контр;
// Во временную переменную передаем
значение выборки
    Долг=Запрос.СумКонОст;
// Определяем суммарный долг по текущему
значению выборки
// Дальше уже все знакомые нам методы
    Если ТЭ.ЭтоГруппа()=1 Тогда
      НазГр=СокрЛП(ТЭ.Наименование);
      Если  Долг=0 Тогда
      ИначеЕсли Долг>0 Тогда
        Мы=Долг;
        Нам=0;
      ИначеЕсли Долг<0 Тогда
        Мы=0;
        Нам=-Долг;
      КонецЕсли;
      Таб.ВывестиСекцию("Группа");
    Иначе
      Наз="("+СокрЛП(Строка(ТЭ.Код))+") "+СокрЛП(ТЭ.Наименование);
      Если  Долг=0 Тогда
        Продолжить;
      ИначеЕсли Долг>0 Тогда
        Мы=Долг;
        Нам=0;
        ИтогоМы=ИтогоМы+Мы;
      ИначеЕсли Долг<0 Тогда
        Мы=0;
        Нам=-Долг;
        ИтогоНам=ИтогоНам+Нам;
      КонецЕсли;
      Таб.ВывестиСекцию("Строка");
    КонецЕсли;
  КонецЦикла;
  Таб.ВывестиСекцию("Итого");
  Таб.ТолькоПросмотр(1);
  Таб.ПараметрыСтраницы(1,100,1);
  Таб.Показать("");
КонецПроцедуры
- Перейдем
на закладку таблица, создадим шаблон, такого вида:

- Закроем форму
отчета;
- Теперь будем
включать наш отчет в меню. В окне метаданных перейдем на закладку
"Интерфейсы";
- Меню Действия,
команда "Редактировать". Редактировать меню;
- Входим в
редактирование строки "новая колонка...";

- Название
пишем "Отчеты";
- [ОК];
- Открываем
появившийся раздел меню "Отчеты";
- Открываем
подраздел меню "новый...";
- Выбираем
объект – Отчеты.Взаиморасчеты;
- Поля Название,
Подсказка заполнились автоматически. Их можно поменять;
- [ОК];
- Меню Действия
команда "Тест" вызовет окошко, где будет показано, как будет выглядеть
наше меню;
- Закрываем
тестовое окно;
- Закрываем
окно редактирования меню;
- Возвращаемся
к дереву метаданных;
- Сохраняем
конфигурацию;
- Входим в
1С:Предприятие;
- Через меню
Отчеты вызываем наш отчет "Взаиморасчеты";
- Устанавливаем
дату 02.10.2000;
- Нажимаем
[Сформировать];
- Результат.
Мы должны всем поставщикам 1000, из них Винни-Пуху 1000, а всего
наш долг 1000. Что и требовалось;
2.16
Документ "Выплата денег".
Документ "Выплата
денег" будет практически аналогичен документу "Приход денег". Поэтому
мы его создадим простым копированием. И потом внесем в него ряд
небольших изменений.
- В дереве
метаданных скопируем документ "ПриходДенег" в буфер обмена Windows;
- Вставим из
буфера обмена в раздел "Документы" копию;
- Изменим Идентификатор
на "ВыплатаДенег", аналогично изменим Синоним и комментарий;
- Внесем соответствующие
косметические изменения в форму документа;
- В модуле
проведения документа вместо строки:
Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
напишем
Регистр.Взаиморасчеты.ДвижениеРасходВыполнить();
- В модуле
проведения документа вместо строки:
Регистр.Взаиморасчеты.ФлагДвижения = 4;
напишем
Регистр.Взаиморасчеты.ФлагДвижения = 3;
- В журнале
"ДвижениеДенег" изменим реквизит "Сумма";
- В выбранные
значения добавим реквизит "Сумма" из нового документа;
- Перейдем
на закладку "Интерфейсы" и добавим в меню в раздел "Документы"
наш документ "ВыплатаДенег";
- Команду укажем
– Документы.ВыплатаДенег.Ввести;
- Закроем лишние
окна;
- Сохраним
конфигурацию;
- Откроем 1С:Предприятие;
- Создадим
новый документ типа "Выплата денег". Заполним его. Сохраним. Проведем.
И полюбуемся на движения которые сформировал документ и результат,
который выдаст нам отчет;
<<
Предыдущая глава | Содержание
| Следующая
глава >>
|