Обмен загрузка истина

В некоторых типовых конфигурациях фирмы 1С существует возможность ручной корректировки движений документа по регистрам. В конфигурации 1С: Бухгалтерия 8 для этого, при наличии соответствующих прав, нужно открыть движения документа и установить флаг «Ручная корректировка”. Однако, иногда возникает необходимость выполнить корректировку движений большого количества документов. В этом случае нам понадобится обработка, которая изменит движения документов без перепроведения.

Рассмотрим как изменить движения документа на примере конфигурации 1С: Бухгалтерия 8. Менять будем движения по регистру бухгалтерии «Хозрасчетный”. Пусть перед нами стоит задача заполнить суммы налогового учета по данным бухгалтерского. Предположим, что у нас уже есть обработка, которая выбирает необходимые нам документы и последовательно обрабатывает их с помощью описанной нами процедуры «ИзменитьДвиженияДокумента”. Посмотрим как должна выглядеть эта процедура.

Код 1C v 8.х Процедура ИзменитьДвиженияДокумента(ДокументСсылка)
// прочитаем набор записей регистра по документу
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// переберем все записи набора и заполним суммы по налоговому учету
Для каждого Запись из НаборЗаписей Цикл
// перед изменением сумм проверяем ведется ли налоговый учет на выбранном счёте
Если Запись.СчетДт.НалоговыйУчет Тогда
Запись.СуммаНУДт = Запись.Сумма;
КонецЕсли;
Если Запись.СчетКт.НалоговыйУчет Тогда
Запись.СуммаНУКт = Запись.Сумма;
КонецЕсли;
КонецЦикла;
// установим признак обмена данными
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
// установим признак ручной корректировки документа,
// предварительно установив признак обмена данными
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.РучнаяКорректировка = Истина;
ДокументОбъект.Записать();
КонецПроцедуры

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

Запись не верна! Поле «Сумма (налоговый учет)” должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)

Режим обмена данными устанавливается следующими строками:

Код 1C v 8.х НаборЗаписей.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ОбменДанными.Загрузка = Истина;

Это необходимо для того, чтобы не выполнялся программный код, находящийся в обработчиках событий «ПередЗаписью” модуля набора записей регистра бухгалтерии «Хозрасчетный” и модуля корректируемого документа. В каждом из них (для типовых конфигураций) есть проверка следующего вида:

Код 1C v 8.х Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Признак ручной корректировки документа (ДокументОбъект.РучнаяКорректировка = Истина) необходимо устанавливать для того, чтобы изменения сохранились при повторном проведении документа. При проведении такого документа в конфигурации 1С:Бухаглерия 8 выдается следующее сообщение:

Движения документа отредактированы вручную и не могут быть автоматически актуализированы.

Свойство ОбменДанными

рубрики: УРБД | Дата: 1 сентября, 2017

Если вы в любой типовой конфигурации сделаете глобальный поиск по слову ОбменДанными, то увидите массу ссылок на него. И в общих модулях, и в модулях справочников, документов, регистров и т.д. Рассмотрим, что это за свойство и для чего применяется.

Краткий обзор

Если в синтакс-помощнике открыть ветку Прикладные объекты, можно обнаружить, что у многих из них: СправочникОбъект, ДокументОбъект, для регистров НаборЗаписей и т.д. есть свойство ОбменДанными.

Тип у этого объекта: ПараметрыОбменаДанным, который в свою очередь содержит три свойства

  • Загрузка
  • Отправитель
  • Получатели

Эти свойства используются в процессе обмена между узлами распределенной информационной базы. В свойстве Отправитель храниться ссылка на узел в котором было произведено изменение объекта. Получатели содержит набор узлов плана обмена, в который будут выгружаться изменения. В случае необходимости каких-то нестандартных действий при обменен данными между базами и отправителя и состав набора узлов можно изменять программно. А вот на третьем свойстве — Загрузка хочется остановиться подробнее.

Свойство ОбменДанными.Загрузка

Если данное свойство установлено в значение Истина, это указывает на то, что производится запись объекта, полученного через механизмы обмена данными. При этом подразумевается, что объект содержит корректные данные и платформа 1С производит минимальное количество проверок. Но очень часто при записи объекта делается множество программных проверок в предопределенных процедурах модуля объекта. И этот код выполняется в том числе и при записи объекта, полученного из файла обмена. И в этом случае могут возникать ошибки, например, из-за того, что проверяемые данные просто еще не записаны.

Поэтому очень часто в модулях объектов можно встретить вот такой код:

Процедура ПередЗаписью(Отказ) Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; //Здесь код с проверкой данных КонецПроцедуры

Это позволяет избежать лишних проверок при обмене данными между базами. Конечно же если какой-то код должен выполняться в любом случае — его необходимо разместить перед проверкой свойства Загрузка. Этот момент надо обязательно учитывать при проектировании новых объектов метаданных, если у вас распределенная база данных и новый объект учавствует в обмене.

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

НовыйТовар = Справочники.Товары.СоздатьЭлемент(); НовыйТовар.Наименование = «Тестирование записи»; НовыйТовар.ОбменДанными.Загрузка = Истина; НовыйТовар.Записать();

И в каких-то исключительных ситуациях это действительно может помочь как временная мера. Но злоупотреблять этим не стоит.

Для того чтобы существовала возможность обмена какими-либо данными с кем-либо, необходимо некоторым образом идентифицировать тех, с кем мы будем обмениваться, и для каждого из них описать перечень обмена
Обе эти задачи позволяет решать прикладной объект конфигурации План обмена.
При помощи планов обмена мы получаем информацию о том, какие элементы данных были изменены и в какой узел обмена их необходимо передать. Это возможно благодаря тому, что планы обмена содержат механизм регистрации изменений. Информация об измененных данных переносится с помощью сообщений, инфраструктура которых также поддерживается планами обмена.
Подобно тому, как элементами данных справочника являются элементы справочника, элементами данных плана обмена являются узлы плана обмена. Каждый узел идентифицирует участника обмена по данному плану обмена. Кроме этого в каждом плане обмена всегда существует один предопределенный узел, идентифицирующий данную информационную базу.
В состав данных, которыми может производиться обмен, входят элементы информационных структур базы данных, которые описываются следующими объектами встроенного языка:
Константа.МенеджерЗначения.<имя>;
СправочникОбъект.<имя>;
ДокументОбъект.<имя>;
ПоследовательностьНаборЗаписей.<имя>;
ПланВидовХарактеристикОбъект.<имя>;
ПланСчетовОбъект.<имя>;
ПланВидовРасчетаОбъект.<имя>;
РегистрСведенийНаборЗаписей.<имя>;
РегистрНакопленияНаборЗаписей.<имя>;
РегистрБухгалтерииНаборЗаписей.<имя>;
РегистрРасчетаНаборЗаписей.<имя>;
ПерерасчетНаборЗаписей.<имя>;
БизнесПроцессОбъект.<имя>;
ЗадачаОбъект.<имя>;
УдалениеОбъекта.
При описании состава данных плана обмена разработчик имеет возможность указать для каждого типа объектов признак Авторегистрация. Он определяет, каким образом план обмена будет отслеживать изменения этих данных.

Создание плана обмена Филиалы
Состав данных обмена должен выглядеть следующим образом:
Теперь с помощью конструктора создадим основную форму узла, чтобы описать в ней некоторые действия, которые должны выполняться при создании нового узла обмена.
Суть этих действий будет заключаться в том, что при создании нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена.
Прежде всего, опишем в модуле формы узла служебную переменную, которая будет хранить признак того, является ли записываемый узел новым или нет.
Перем РегистрацияВНовыйУзел;
Затем создадим обработчик события формы ПередЗаписью.
Код 1C v 8.х Процедура ПередЗаписью(Отказ)
РегистрацияВНовыйУзел = ЭтоНовый();
КонецПроцедуры
Этот обработчик и будет устанавливать значение нашей служебной переменной в Истина в случае записи нового узла плана обмена.
После этого создадим обработчик события формы ПриЗаписи.
Код 1C v 8.х Процедура ПриЗаписи(Отказ)
Если РегистрацияВНовыйУзел Тогда
// Регистрация изменений всех данных для узла
ПланыОбмена.ЗарегистрироватьИзменения(Ссылка);
КонецЕсли;
КонецПроцедуры
Создание обработки Обмен данными
Откроем конфигуратор и создадим новый объект конфигурации Обработка с именем ОбменДанными. Перейдем на закладку Прочее и откроем модуль объекта.
Создадим в нем процедуру ОбменСФилиалами.
Код 1C v 8.х Процедура ОбменСФилиалами() Экспорт
ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
// Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел)
Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
// Получить сообщение
УзелОбъект.ПрочитатьСообщениеСИзменениями();
// Сформировать сообщение
УзелОбъект.ЗаписатьСообщениеСИзменениями();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Теперь создадим основную форму обработки и в обработчик события нажатия кнопки Выполнить – КнопкаВыполнитьНажатие вставим вызов процедуры ОбменСФилиалами().
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Элемент)
ОбменСФилиалами();
КонецПроцедуры
Создание процедуры записи данных
Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы. Сначала создадим процедуру, которая используется нами при обмене данными, – ЗаписатьСообщениеСИзменениями.
Код 1C v 8.х Процедура ЗаписатьСообщениеСИзменениями() Экспорт
Сообщить(«——— Выгрузка в узел » + Строка(ЭтотОбъект) + » ———«);
Каталог = КаталогВременныхФайлов();
// Сформировать имя временного файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = «\»,»», «\») + «Message»
+ СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + «_» +
СокрЛП(Ссылка.Код) + «.xml»;
// Создать объект записи XML
// *** Запись XML-документов
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// *** Инфраструктура сообщений
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
Сообщить(«Номер сообщения: » + ЗаписьСообщения.НомерСообщения);
// Получить выборку измененных данных
// *** Механизм регистрации изменений
ВыборкаИзменений =ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель,
ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
// Записать данные в сообщение
// *** XML-сериализация
ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());
КонецЦикла;
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Сообщить(«——— Конец выгрузки————«);
КонецПроцедуры
На этом создание процедуры записи данных обмена закончено.
Создание процедуры чтения данных
Код 1C v 8.х Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Каталог = КаталогВременныхФайлов();
// Сформировать имя файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = «\», «», «\») + «Message»
+ СокрЛП(Ссылка.Код) + «_» +
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + «.xml»;
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
// *** Чтение документов XML
// Попытаться открыть файл
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Исключение
Сообщить(«Невозможно открыть файл обмена данными.»);
Возврат;
КонецПопытки;
Сообщить(«——— Загрузка из » + Строка(ЭтотОбъект) + «————«);
Сообщить(» — Считывается файл » + ИмяФайла);
// Загрузить из найденного файла
// *** Инфраструктура сообщений
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
// Читать заголовок сообщения обмена данными — файла XML
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
// Сообщение предназначено не для этого узла
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
ВызватьИсключение «Неверный узел»;
КонецЕсли;
// Удаляем регистрацию изменений
// для узла отправителя сообщения
// *** Служба регистрации изменений
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
// Читаем данные из сообщения
// *** XML-сериализация
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
// Читаем очередное значение
Данные = ПрочитатьXML(ЧтениеXML);
// Записать полученные данные
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайла);
Сообщить(«——— Конец загрузки————«);
КонецПроцедуры
Информация взята с сайта http://helpf.pro

Универсальные процедуры и функции¶

Проверка битых ссылок¶

ЭтоБитаяСсылка = не ЗначениеЗаполнено(Ссылка.ВерсияДанных);

Возвращает полное имя объекта метаданных по переданному значению ссылки¶

// Возвращает полное имя объекта метаданных по переданному значению ссылки // Например, // «Справочник.Номенклатура»; // «Документ.ПриходнаяНакладная» // // Параметры: // Ссылка — ЛюбаяСсылка — значение ссылки, для которого необходимо получить имя таблицы ИБ // // Возвращаемое значение: // Строка — полное имя объекта метаданных для указанного значения ссылки // Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт Возврат Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя(); КонецФункции

МенеджерИсторииРаботыПользователя¶

// Добавить событие в историю работы пользователя ИсторияРаботыПользователя.Добавить(ПолучитьНавигационнуюСсылку(Объект.Ссылка));

ОтображениеСостояния¶

Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Пример:

ОчиститьСообщения();

Отбор в таблице значений (табличной части) с помощью построителя запроса¶

&НаСервере Функция ПолучитьКоличествоПодобраноПоСтрокеНаСервере(ИсходнаяНоменклатура) ПостроительЗапр = Новый ПостроительЗапроса; ПостроительЗапр.ИсточникДанных = Новый ОписаниеИсточникаДанных(Объект.НоваяНоменклатура.Выгрузить()); Отбор = ПостроительЗапр.Отбор.Добавить(«ИсходнаяНоменклатура»); Отбор.ВидСравнения = ВидСравнения.Равно; Отбор.Значение = ИсходнаяНоменклатура; Отбор.Использование = Истина; ПостроительЗапр.Выполнить(); ПостроительЗапр.Результат.Выгрузить().Итог(«Количество»); КонецФункции

Запись справочника¶

Функция ЗаписатьСправочник(ТекущийОбъект,Заголовок=»»,РежимСообщений=»Все»,РежимЗагрузки=Ложь) Экспорт ДействиеВыполнено = Ложь; ВыводитьОшибки = ?(РежимСообщений=»Все» ИЛИ РежимСообщений=»Ошибки»,Истина,Ложь); ВыводитьИнформацию = ?(РежимСообщений=»Все»,Истина,Ложь); Попытка Если РежимЗагрузки Тогда ТекущийОбъект.ОбменДанными.Загрузка = Истина; КонецЕсли; ТекущийОбъект.Записать(); ДействиеВыполнено = Истина; Если ВыводитьИнформацию Тогда ТекстСообщения = «Записан справочник «»»+ТекущийОбъект.Ссылка+»»». «; СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Информация); КонецЕсли; Исключение ДействиеВыполнено = Ложь; Если ВыводитьОшибки Тогда ТекстСообщения = «Не удалось записать справочник «»»+ТекущийОбъект.Ссылка+»»». «+ОписаниеОшибки(); СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Важное); КонецЕсли; КонецПопытки; Возврат ДействиеВыполнено; КонецФункции //ЗаписатьПровестиДокумент()

Запись и проведение документа¶

// Процедура выполняет запись/проведение/отмену проведения документа. // // Параметры: // ТекущийОбъект – ДокументОбъект,СправочникОбъект. // РежимЗаписи — РежимЗаписиДокумента. // Заголовок — Строка. // РежимСообщений — Строка: «Нет»,»Все»,»Ошибки». // // Возвращаемое значение: // ДействиеВыполнено – Булево. // Функция ЗаписатьПровестиДокумент(ТекущийОбъект,РежимЗаписи,Заголовок=»»,РежимСообщений=»Все») Экспорт ДействиеВыполнено = Ложь; ВыводитьОшибки = ?(РежимСообщений=»Все» ИЛИ РежимСообщений=»Ошибки»,Истина,Ложь); ВыводитьИнформацию = ?(РежимСообщений=»Все»,Истина,Ложь); Если РежимЗаписи = РежимЗаписиДокумента.Запись ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Попытка ТекущийОбъект.Записать(РежимЗаписиДокумента.Запись); ДействиеВыполнено = Истина; Если ВыводитьИнформацию Тогда ТекстСообщения = «Записан документ «»»+ТекущийОбъект.Ссылка+»»». «; СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Информация); КонецЕсли; Исключение ДействиеВыполнено = Ложь; Если ВыводитьОшибки Тогда ТекстСообщения = «Не удалось записать документ «»»+ТекущийОбъект.Ссылка+»»». «+ОписаниеОшибки(); СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Важное); КонецЕсли; КонецПопытки; КонецЕсли; Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Попытка ТекущийОбъект.Записать(РежимЗаписиДокумента.Проведение); ДействиеВыполнено = Истина; Если ВыводитьИнформацию Тогда ТекстСообщения = «Проведен документ «»»+ТекущийОбъект.Ссылка+»»». «; СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Информация); КонецЕсли; Исключение ДействиеВыполнено = Ложь; Если ВыводитьОшибки Тогда ТекстСообщения = «Не удалось провести документ «»»+ТекущийОбъект.Ссылка+»»». «+ОписаниеОшибки(); СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Важное); КонецЕсли; КонецПопытки; КонецЕсли; Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда Попытка ТекущийОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения); ДействиеВыполнено = Истина; Если ВыводитьИнформацию Тогда ТекстСообщения = «Отменено проведение документа «»»+ТекущийОбъект.Ссылка+»»». «; СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Информация); КонецЕсли; Исключение ДействиеВыполнено = Ложь; Если ВыводитьОшибки Тогда ТекстСообщения = «Не удалось отменить проведение документа «»»+ТекущийОбъект.Ссылка+»»». «+ОписаниеОшибки(); СообщитьОбОшибке(ТекстСообщения,,Заголовок,СтатусСообщения.Важное); КонецЕсли; КонецПопытки; КонецЕсли; Возврат ДействиеВыполнено; КонецФункции // ЗаписатьПровестиДокумент()

Проверка на пустую дату¶

Пустая дата

Дата(«00010101»); Дата(1, 1, 1); Дата(«00010101000000»); Дата(«0001-01-01»);

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

// Функция СтрокаТаблицыЗначенийВСтруктуру создает // структуру со свойствами, как колонки таблицы // значений передаваемой строки // и устанавливает этим свойствам значения // из строки таблицы значений. // // Параметры: // СтрокаТаблицыЗначений — СтрокаТаблицыЗначений. // // ВозвращаемоеЗначение: // Структура // Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт Структура = Новый Структура; Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений); КонецЦикла; Возврат Структура; КонецФункции

Загрузка таблицы/соответствия из макета с помощью построителя отчета¶

Функция ЗаполнитьСоответствиеИзМакета(ИмяМакета) Макет = ПолучитьМакет(ИмяМакета); ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Макет.Область()); ТЗ = ПостроительЗапроса.Результат.Выгрузить(); Результат = Новый Соответствие; Для каждого Стр Из ТЗ Цикл Результат.Вставить(Стр.Колонка1, Стр.Колонка2); КонецЦикла; Возврат Результат; КонецФункции

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *