Главная » 1С Предприятие » ЗАГРУЗКА  НАЧАЛЬНОГО САЛЬДО  ИЗ  DBF-ФАЙЛА

0

При  смене  программных  средств неизбежно возникают задачи  переноса  остатков из старых   файлов  в   новые.  Нередко  переносимые данные  можно  записать  в   DBFфайлы. Предположим, что так оно  и есть  и начальное сальдо нужно  перенести из файла bal.dbf,  фрагмент  которого  представлен в  табл.  7.7,  в  созданный  нами  и  пока  что пустой  ЖЗ.

Фрагмент файла bal.dbf с начальным сальдо

Таблица 7.7

Employee

Balance

Абрамова Лариса Сергеевна

2.60

Агальцов Юрий Алексеевич

1.70

Бараненков Иван Ильич

0.30

Алгоритм  переноса нетруден:

|.     Начало.

2.              Открыть файл  bal.dbf  и  переместиться   на  его  первую  запись.  ,

3.              Пока  не обнаружен конец файла  bal.dbf, выполнить:

3.1.    Осуществить поиск по наименованию элемента справочника Сотрудники_2, применяя в качестве наименования значение поля  Employee файла  bal.dbf.

3.2.    Если элемент найден, то

Добавить в ЖЗ  запись, объектом которой является  найденный элемент, используя в качестве результата  значение  поля  Balance  файла  bal.dbf.

конец если 3.2.

Перейти к следующей записи файла  bal.dbf.

конец цикла 3.

4.              Добавить запись в документ НачПериода_2 о первом расчетном периоде ЖЗ.

р.   Конец.

В 1С подобные алгоритмы программируются с помощью  объектов типа XBase, позволяющих управлять DBF-файлами.  Разместим по обычаю код, реализующий  алгоритм переноса  в модуле  обработки Проба. Рисунки, отображающие  результаты работы  программы переноса данных, приведены сразу после  ее текста.

Процедура одинСотр(жз, сотр, тДок, хозОп, нтп, начС) далее функция ЕстьВЖЗ(жз, сотр) далее

Процедура ФиксироватьСменуРП(жз, док, нтп) далее

процедура  Выполнить(  ) перем дбф;

перем файл, папка, фио, сотр;

перем сСотр_2, жз, док, тДок, хозОп, флаг, флагЖЗ, нтп; ОчиститьОкноСообщений();

// Открываем диалог для выбора файла bal.dbf

флаг = ФС.ВыбратьФайл(0, файл, папка, "Выберите файл"," | *.DBF"); если флаг = 0 тогда

возврат; конецЕсли;

дбф  =  СоздатьОбъект("ХВаве"); дбф.ОткрытьФайл(папка + файл); если дбф.Открыта() = 0 тогда

Предупреждение("Не удалось открыть файл " + файл); возврат;

конецЕсли;

сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2"); жз  =  СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); хозОп = СоздатьОбъект("Справочник.ХозОпДляВР");

// Ищем простым перебором в справочнике ХозОпДляВР вид расчета НачСальдо_2 хозОп.ВыбратьЭлементы();

флаг = 0;

пока хозОп.ПолучитьЭлемент()  = 1 цикл

если  хозОп.ВР =  ВидРасчета.НачСальдо_2 тогда флаг = 1;

прервать; конецЕсли;

конецЦикла; // пока

если флаг  = 0 тогда

Предупреждение("Хозяйственная операция  для  ВР Начальное сальдо  не найдена."); возврат;

конецЕсли;

док =  СоздатьОбъект("Документ.НачПериода_2");

// Номер документа не меняется и всегда равен единице док.НайтиПоНомеру(1, Дата(0));

если док.Выбран() = 0 тогда

Предупреждение("Создаю документ НачПериода_2 под номером  1.", 2); док.Новый();

док.НомерДок = 1;

док.ДатаДок  = ТекущаяДата(); док.Записать();

конецЕсли;

тДок  = док.ТекущийДокумент();

нтп = жз.НачалоТекущегоПериода(); флагЖЗ = 0;

дбф.КодоваяСтраница(0);                     //             Используем Windows-кодировку дбф.Первая();                     //              Перемещаемся на первую запись DBF-файла

// Перебираем все, кроме удаленных, записи ранее открытого DBF-файла

дбф.Показывать Удаленные(0);

пока  дбф.ВКонце( ) = 0 цикл        //     Пока не достигнут конец DBF-файла фио = дбф.Employee;    //         ФИО сотрудника

// Задаем поиск во всем справочнике Сотрудники_2

флаг = сСотр_2.НайтиПоНаименованию(фио, 0); если флаг = 1 тогда

флагЖЗ = 1;                //         В ЖЗ  добавлена  по крайней мере  одна запись сотр = сСотр_2.ТекущийЭлемент();

// Запись для одного сотрудника

одинСотр(жз, сотр, тДок, хозОп, нтп, дбф.Balance);  конецЕсли;

// Добавляем запись в документ НачПериода_2 о первом расчетном  периоде ЖЗ

// Результат см. на рис. 7.27

ФиксироватьСменуРП(жз, док, нтп);

// Вызовы форм  ЖЗ  и документа НачПериода_2 под номером  1

// для просмотра результата ОткрытьФорму("ЖурналРасчетов.Зарплата_2"); ОткрытьФорму(тДок);

иначе

Предупреждение("В ЖЗ не перенесено  ни одной записи."); конецЕсли;

конецПроцедуры // Выполнить

процедура одинСотр(жз, сотр, тДок, хозОп, нтп, начС)

// Если расчет  с ВР  НачСальдо_2 объект  уже имеет, то обновляем только результат если ЕстьВЖЗ(жз,  сотр) = 0 тогда

// Добавляем расчет с ВР НачСальдо_2  для выбранного сотрудника

жз.Новая(); жз.УстановитьРеквизит("Документ",  тДок); жз.УстановитьРеквизит("РодительскийДокумент",  тДок); жз.УстановитьРеквизит("Объект",  сотр); жз.УстановитьРеквизит("ВидРасч",   ВидРасчета.НачСальдо_2); жз.УстановитьРеквизит("хозОп",  хозОп.ХозОП); жз.УстановитьРеквизит("ДатаНачала",  нтп); жз.УстановитьРеквизит("ДатаОкончания", нтп); жз.УстановитьРеквизит("Рассчитана",  1);

иначе                                        //                         Делаем  расчет  нефиксированным

// Журнал позиционирован функцией ЕстьВЖЗ на нужной записи

// Подготовка к обновлению результата

жз.ОсвободитьЗапись();                //          Делаем  запись нефиксированной конецЕсли;

// Заносим  в атрибут Результат величину начального сальдо сотрудника  жз.УстановитьРеквизит("Результат",  начС);

// Не забываем записать новые значения реквизитов

жз.3аписать(); жз.ФиксироватьЗапись();

конецПроцедуры // одинСотр

// Вернет  1, если начальное сальдо для выбранного  объекта  уже введено,

// или О-в противном случае функция ЕстьВЖЗ(жз, сотр)

если жз.ВыбратьПериодПоОбъекту(сотр) = 1 тогда пока жз.ПолучитьЗапись() = 1 цикл

если жз.ВидРасч = ВидРасчета.НачСальдо_2 тогда возврат 1;

конецЕсли;

конецЦикла // пока конецЕсли;

возврат 0; конецФункции // ЕстьВЖЗ

// Заносит данные о смене расчетного периода в документ НачПериода_2 процедура ФиксироватьСменуРЩжз, док, нтп)

// период переменная типа РасчетныйПериод

док.НоваяСтрока();            //                  Добавляем  в документ новую строку док.НовПериод = жз.ОписательПериода(нтп);

// Дата смены расчетного периода ЖЗ Зарплата_2 док.ДатаУстановки = ТекущаяДата(); док.Пользователь = ИмяПользователя(); док.Записать();

конецПроцедуры // ФиксироватьСменуРП

Рис. 7.26. Расчеты НачСальдо_2 введены из файла bal.dbf

Рис. 7.27. Первый расчетный период в документе НачПериода_2 № 1

Замечания:

1.       Первый    расчетный   период   задается    при   создании   ЖЗ    в    поле   Дата   отсчета (см. рис. 7.19).

2.       Не  исключено, что для изменения кодировки  записей DBF-файла, вам придется прибегнуть  к встроенным  функциям  OemToAnsi и AnsiToOem, приведенным в  табл.  2.8.

7.4.2.    ОТЧЕТ ПО НАЧАЛЬНОМУ САЛЬДО

Отчеты, как  мы  уже  знаем,  сподручнее всего строить  на  базе  запросов.  Напишем  запрос, осуществляющий  выбор  из  ЖЗ  расчетов  с  заданным типом  ВР, и  разместим его в модуле  обработки Проба. Запрос и сопровождающий его код крайне просты:

// Формирует  и выполняет запрос запр

функция  ВыпЗапр(запр, ВРДляЗапр) далее

процедура ВыводЗапрТЗнач(запр) далее            //       Выводит запрос в таблицу значений  процедура ВыводЗапрСооб(запр) далее           //       Выводит запрос  в окно сообщений

процедура  Выполнить() перем запр, ВРДляЗапр;

ВРДляЗапр = ВидРасчета.НачСальдо_2; запр  = СоздатьОбъект("Запрос");

// Передаем функции ВыпЗапр значение ВР для отбора  расчетов

// Функция  ВыпЗапр формирует  и выполняет запрос запр

// Если запрос выполнен

если ВыпЗапр(запр, ВРДляЗапр) = 1 тогда

ВыводЗапрТЗнач(запр);

//

Выводит запрос в таблицу значений

ВыводЗапрСооб(запр);

//

Выводит запрос в окно  сообщений

конецЕсли;

конецПроцедуры // Выполнить

функция  ВыпЗапр(запр, ВРДляЗапр)    //   Формирует  и выполняет запрос запр

перем жз, нтп, текстЗапр;            //       текстЗапр текст запроса жз =  СоздатьОбъект("ЖурналРасчетов.Зарплата_2");

нтп = жз.НачалоТекущегоПериода(); текстЗапр  = "

| период с нтп по нтп;          //      Подходящий для Начального  сальдо период

// Определяем  переменные  запроса; они содержат нужные нам данные

|  сотр  = ЖурналРасчетов.Зарплата_2.0бъект;

|  ВР = ЖурналРасчетов.Зарплата_2.ВидРасч;

|  рез  = ЖурналРасчетов.Зарплата_2.Результат;

// Задаем порядок выборки данных

| группировка  сотр упорядочить по сотр.Наименование;

// Условие отбора данных

| условие (ВР  = ВРДляЗапр);";

// Выполняем запрос

возврат запр.Выполнить(текстЗапр); конецФункции // ВыпЗапр

процедура ВыводЗапрТЗнач(запр)       //    Выводит запрос в таблицу значений  перем тЗнач;

// Объект тЗнач создаем для промежуточной  демонстрации выборки запроса

тЗнач = СоздатьОбъект("ТаблицаЗначений");

// Выгружаем для  предварительного просмотра все переменные запроса

// в таблицу  значений тЗнач

запр.Выгрузить(тЗнач,  1);

// Просмотр таблицы значений  (результатов запроса). Результат см.  на рис.  7.28 тЗнач.ВыбратьСтроку(, "Начальное  сальдо в таблице значений");

энецПроцедуры // ВыводЗапрТЗнач

выводит запрос в окно  сообщений

Результат имеет ту же структуру, что  и данные в таблице, приведенной  на рис.  7.28 эоцедура  ВыводЗапрСооб(запр)

// В этой  процедуре еще раз  иллюстрируется  метод  запросов Группировка пока запр.Группировка("сотр") = 1 цикл

если запр.ЭтоГруппа("сотр") = 1 тогда

Сообщить("Сотрудники подразделения " + запр.сотр);

иначе

Сообщить(СокрЩзапр.сотр) + СимволТабуляции + запр.ВР + СимволТабуляции + запр.рез);

конецЕсли; конецЦикла; // пока

конецПроцедуры // ВыводЗапрСооб

Рис. 7.28. Результат запроса о начальном сальдо с группами

Группы (имена  родителей)   не  попадут   в  запрос, если  оператор  Группировка дополнить опцией Без групп:

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

Рис. 7.29. Результат запроса о начальном сальдо с группами

Из  рис. 7.28  и  7.29  видно,  что  элементы-родители  справочника  Сотрудники_2  являются в запросе группами  и  метод  запр.ЭтоГруппа("сотр")  вернет для  них  единицу. Для  иных записей этот  метод  вернет нуль.

Первая  строка таблицы  значений   отображает  начало   выборки.  Строка  содержит пустое  значение  переменной запроса сотр. Первое же употребление метода

запр.Группировка("сотр");

приведет к перемещению позиции  выборки  на  ее  первую, содержащую  непустое  значение переменной сотр запись.

Если  в текст  запроса добавить переменную род, содержащую родителя объекта:

| род = ЖурналРасчетов.Зарплата_2.0бъект.Родитель; то результат  запроса не изменится.

Если  же вдобавок в  тексте  запроса разместить  и  группировку по род, то есть  пере­

дать  методу  Выполнить  такой  текст:

текстЗапр ="

| период с нтп по нтп;

| род = ЖурналРасчетов.Зарплата_2.Объект.Родитель;

| сотр = ЖурналРасчетов.Зарплата_2.Объект;

I BP = ЖурналРасчетов.Зарплата_2.ВидРасч;

|  рез = ЖурналРасчетов.Зарплата_2.Результат;

| группировка  род;

| группировка  сотр упорядочить по сотр.Наименование;

| условие  (ВР = ВРДляЗапр);";

то  в  таблице  значений  мы  увидим дополнительные  строки, в  которых  переменная  запроса сотр имеет пустое значение  (рис. 7.30).

Рис. 7.30. Запрос с двумя группами

Эти  строки, кроме  первой, начинают  группы  род. Первая  строка  это  начало  выборки. В ней  и род и сотр имеют пустые  значения.

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

// Выводит запрос в окно сообщений для случая двойной группировки процедура ВыводЗапрСооб(запр)

// В этой процедуре еще раз иллюстрируется метод запросов Группировка пока запр.Группировка("род") = 1 цикл

Сообщить("Сотрудники подразделения " + запр.род); пока запр.Группировка("сотр") = 1 цикл

если запр.ЭтоГруппа("сотр") = 0 тогда Сообщить(СокрП(запр.сотр) + Символ Табуляции + запр.ВР +

СимволТабуляции + запр.рез); конецЕсли;

конецЦикла;  // пока запр.Группировка("сотр") = 1 конецЦикла; // пока запр.Группировка("род") =1

конецПроцедуры // ВыводЗапрСооб

Результат соответствует рис. 7.28: Сотрудники подразделения 01 Цех

Сотрудники  подразделения 01/1

Агальцов Юрий Алексеевич

Начальное сальдо

1.7

Добрецов Борис Юрьевич

Начальное сальдо

0.1

Сотрудники  подразделения 01/2

Ьараненков Иван Ильич

Начальное сальдо

0.3

Сравнение  двух запросов  показывает, что  при  запросах к  ЖЗ  для  вывода сотрудников  с разбивкой  по  цехам  нет  необходимости  вводить в  текст  запроса переменную род и  устраивать вторую группу.   Все  необходимые  данные даст  группировка по  переменной  запроса сотр.

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии