Мы подошли к самой важной и сложной части задачи – описанию товарооборота. Первым документом у нас будет приходная накладная. Нам надо занести остатки на склады, иначе нечего будет перемещать, ни тем более списывать.
Возьмем обычную бумажную накладную. Номер накладной зависит от поставщика. Значит сделаем возможность заносить не уникальные номера приходных накладных. В ней кроме полей Номер документа и дата документа присутствуют стороны, участвующие в товарообороте - "От кого" и "Кому". В нашей приходной накладной им будут соответствовать поля "Поставщик" – наш контрагент и "Склад" – наш склад. Добавим еще одно поле – "Договор", нам надо знать, на основании чего произошла поставка товара.
Перейдем к табличной
части. Имеется графа "Наименование товара". Этой графе будет соответствовать
графа "Товар", Графы "Кол", "Цена", "Сумма" – так будет и у нас.
Кроме этих граф добавятся следующие – "Ед" (единица измерения) –
она покажет, в чем мы измеряем количество. "КолО" – если мы количество
в графе "Кол", например, для яблок можем указать или в килограммах,
или в ящиках, пишем в произвольной единице измерения, то в графе
"КолО" – мы его приводим к основной единице измерения товара. На
разные сорта товара будет разная цена, значит нам надо указывать
сорт в новой графе "Сорт". Таким образом цена у нас будет – ценой
выбранного сорта основной единицы измерения товара. По графам "КолО"
и "Сумма" нам понадобится итог по колонке. Документ мы разместим
в журнале накладных.
Идентификатор: ПриходнаяНакладная Журнал: Накладные Нумератор: Нет         Периодичность: Год Длина: 5         Тип: число Уникальность: нет     Автонумерация: нет Оперативный учет: да Может являться основанием для документа любого вида?: нет |
|||
Является основанием для |
Вводится на основании |
||
Шапка |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Поставщик |
От кого пришел товар |
С.Контрагенты |
|
Договор |
Основание отгрузки товара |
С.Договора |
|
Склад |
Куда пришел товар |
С.Склады |
|
Таблица |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Товар |
Товар |
С.Номенклатура |
|
Сорт |
Сорт товара |
С.Сорт |
|
Кол |
Количество в произвольной ед. измерения |
Число 8.2 |
+ |
Ед |
Единица измерения |
С.Единицы |
|
КолО |
Количество в основной ед. измерения |
Число 8.2 |
+,И |
Цена |
Цена поставки |
Число 7.2 |
+ |
Сумма |
Сумма документа |
Число 15.2 |
+,И |
Процедура Товар()
  Если Товар.Выбран()=1 Тогда
    Если Сорт.Выбран()=0 Тогда
// Если сорт не выбран (сорт может быть
выбран если редактируется
// существующая строка)
      Сорт=Константа.СортПоУмолчанию;
    КонецЕсли;
    Если Кол=0 Тогда
      Кол=1;
    КонецЕсли;
    СпрЕд=СоздатьОбъект("Справочник.Единицы");
// создаем в памяти копию справочника
единиц
    СпрЕд.ИспользоватьВладельца(Товар);
// указываем, что нам нужны только единицы,
принадлежащие
// выбранному товару
    СпрЕд.ВыбратьЭлементы();
    Пока СпрЕд.ПолучитьЭлемент()=1 Цикл
// перебираем справочник единиц поэлементно
      Если СпрЕд.Ед=Товар.ЕдИзм
Тогда
// мы нашли единицу соответствующую
основной единице товара
        Ед=СпрЕд.ТекущийЭлемент();
// передаем в реквизит табличной части
найденное значение
        Прервать;
// прерываем обход по циклу. То, что
мы искали уже найдено
      КонецЕсли;
    КонецЦикла;
    КолО=Окр(Кол*(Ед.Коэффициент),2,1);
// пересчитываем количество в количество
основных единиц
    Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
// определяем цену товара с учетом текущего
сорта
    Сумма=Окр(КолО*Цена,2,1);
// вычисляем сумму
  КонецЕсли;
КонецПроцедуры
Процедура Сорт()
  Если Сорт.Выбран()=1 Тогда
    Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
    Сумма=Окр(КолО*Цена,2,1);
  КонецЕсли;
КонецПроцедуры
Процедура Кол()
  КолО=Окр(Кол*(Ед.Коэффициент),2,1);
  Сумма=Окр(КолО*Цена,2,1);
КонецПроцедуры
Процедура Ед()
  КолО=Окр(Кол*(Ед.Коэффициент),2,1);
  Сумма=Окр(КолО*Цена,2,1);
КонецПроцедуры
Процедура Цена()
  Сумма=Окр(КолО*Цена,2,1);
КонецПроцедуры
Процедура Поставщик()
  Договор=ПолучитьПустоеЗначение("Справочник.Договора");
// Функция ПолучитьПустоеЗначение()
возвращает пустое значение
// заданного типа
КонецПроцедуры
Процедура Печать()
  Таб=СоздатьОбъект("Таблица");
  Таб.ИсходнаяТаблица("Таблица ");
  Таб.ВывестиСекцию("Шапка");
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл
    НС=НомерСтроки;
// атрибут НомерСтроки возвращает номер
текущей строки
// табличной части
    Таб.ВывестиСекцию("Строка");
  КонецЦикла;
  ИтогПр=Формат(Итог("Сумма"),"ЧПДС");
// В переменную ИтогПр мы выведем сумму
прописью
  Таб.ВывестиСекцию("Подвал");
  Таб.ТолькоПросмотр(1);
  Таб.ПараметрыСтраницы(1,100,1);
  Таб.Показать("");
КонецПроцедуры
Процедура ОбработкаПроведения()
// Долг за поставленный нам товар
возрос
  Регистр.Взаиморасчеты.Контрагент
= Поставщик;
  Регистр.Взаиморасчеты.Договор = Договор;
  Регистр.Взаиморасчеты.Сумма = Итог("Сумма");
  Регистр.Взаиморасчеты.ФлагДвижения = 1;
  Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
// по каждой строке
  ВыбратьСтроки();
  Пока ПолучитьСтроку() = 1 Цикл
// Увеличиваем количество товара на
складе
    Регистр.ОстаткиТоваров.Склад
= Склад;
    Регистр.ОстаткиТоваров.Товар = Товар;
    Регистр.ОстаткиТоваров.Сорт = Сорт;
    Регистр.ОстаткиТоваров.Партия = ТекущийДокумент();
    Регистр.ОстаткиТоваров.Количество = КолО;
    Регистр.ОстаткиТоваров.СуммаП = Сумма;
    Регистр.ОстаткиТоваров.СуммаД = Сумма;
    Регистр.ОстаткиТоваров.ФлагДвижения = 1;
    Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
// Указав команду ПривязыватьСтроку()
мы к каждой записи по движению
// регистра укажем – какая конкретно строка документа произвела
это движение
    Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
// Добавляем запись о росте товарооборота
    Регистр.ОборотыТоваров.Склад
= Склад;
    Регистр.ОборотыТоваров.Товар = Товар;
    Регистр.ОборотыТоваров.Сорт = Сорт;
    Регистр.ОборотыТоваров.Количество = КолО;
    Регистр.ОборотыТоваров.СуммаУ = Сумма;
    Регистр.ОборотыТоваров.ФлагДвижения = 1;
    Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
    Регистр.ОборотыТоваров.ДвижениеВыполнить();
// Оборотный регистр осуществляет
не приход/расход а движение
  КонецЦикла;
КонецПроцедуры
Условия, при которых документ не должен проводиться
напишите сами, если хотите.
В этой
процедуре мы совершили движение сразу по трем регистрам.
По одному - "Взаиморасчеты" – сразу на весь документ суммой, и
по двум другим построчно.
Сколько строк будет в документе, столько и движений по каждому
регистру.
Мы ввели кучу приходных накладных. Теперь нам интересно знать, что на каком складе лежит. Сделаем отчет.
Процедура ПриОткрытии()
  ВыбДата=РабочаяДата();
// РабочаяДата – дата, на которую установлена
в данный момент 1С.
КонецПроцедуры
Процедура Сформировать()
  ТабЗн=СоздатьОбъект("ТаблицаЗначений");
// создаем динамическую 2-х мерную таблицу
  ТабЗн.НоваяКолонка("Товар","Справочник.Номенклатура");
  ТабЗн.НоваяКолонка("Сорт","Справочник.Сорт");
  ТабЗн.НоваяКолонка("Ост","Число",17,2);
// указываем какие колонки будет содержать
наша динимическая таблица
  РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");
// создаем в памяти копию регистра остатков
  РегОст.ВременныйРасчет(1);
// указываем, что из этого регистра
нам, возможно, надо будет получить данные
// на момент времени отличный от текущего
  РассчитатьРегистрыНа(ВыбДата);
// указываем на какой момент времени
надо получить данные из регистров
  РегОст.ВыбратьИтоги();
// открываем выборку итогов из регистра
(на указанный момент времени)
  Пока РегОст.ПолучитьИтог()=1 Цикл
// получаем очередной итог
    ТСклад=РегОст.Склад;
    Если ТСклад=ВыбСклад Тогда
// если текущий итог по выбранному складу
      ТабЗн.НоваяСтрока();
// добавляем в динамическую таблицу
новую строку
      ТабЗн.Товар=РегОст.Товар;
      ТабЗн.Сорт=РегОст.Сорт;
      ТабЗн.Ост=РегОст.Количество;
// заполняем поля д. таблицы
    КонецЕсли;
  КонецЦикла;
  РегОст="";
// убираем из памяти копию регистра.
Она нам больше не нужна
  СтрокаН=0;
  ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
// Это мы делаем, чтобы просмотреть
содержимое динамической таблицы
// у нас будут строки с одинаковым товаром и сортом, они возникли
из-за
// наличия измерения "Партия" нам надо их объединить
  ТабЗн.Свернуть("1,2","3");
// методом Свернуть() мы объединяем
строки у которых содержимое
// в колонках 1 и 2 одинаковое, а колонку 3 мы суммируем
  СтрокаН=0;
  ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
// смотрим что получилось. Строки у
нас идут вразнобой
  ТабЗн.Сортировать("1+,2+");
// отсортируем их. сперва сортируем
по убыванию колонку 1,
// а внутри нее, тоже по убыванию, колонку "Сорт"
  СтрокаН=0;
  ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
// смотрим на результат
  Таб=СоздатьОбъект("Таблица");
  Таб.ИсходнаяТаблица("Таблица");
  Таб.ВывестиСекцию("Шапка");
  ТТовар="@#$%&";
// такого товара у нас, надеюсь, не
будет
  ТабЗн.ВыбратьСтроки();
// открываем выборку строк из д. таблицы
  Пока ТабЗн.ПолучитьСтроку()=1 Цикл
    Товар=ТабЗн.Товар;
    Тов=СокрЛП(Товар.Код)+" ("+СокрЛП(Товар.Наименование)+")";
    Сорт=ТабЗн.Сорт;
    Ост=ТабЗн.Ост;
    Ед=Строка(Товар.ЕдИзм);
    Если ТТовар<>Товар Тогда
// если товар из д. таблицы не совпадает
с переменной ТТовар
      Таб.ВывестиСекцию("Товар");
// выводим эту секцию таблицы для печати
      ТТовар=Товар;
    Иначе
// товар совпадает, только сорт другой
      Таб.ВывестиСекцию("Сорт");
// выводим эту секцию
    КонецЕсли;
  КонецЦикла;
  Таб.ТолькоПросмотр(1);
  Таб.ПараметрыСтраницы(1,100,1);
  Таб.Показать("");
КонецПроцедуры