пятница, 8 ноября 2019 г.

Список общих процедур и функций




Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса) Экспорт
 Если ИменаПараметровСеанса = Неопределено
  И НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
  ВерсияКонфигурацииИБ = ОбновлениеИнформационнойБазы.ВерсияИБ(Метаданные.Имя);
  Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияКонфигурацииИБ, "3.0.44.81") < 0 Тогда
   НастройкиКлиента = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиКлиентскогоПриложения");
   Если НастройкиКлиента = Неопределено Тогда
    НастройкиКлиента = Новый НастройкиКлиентскогоПриложения;
   КонецЕсли;
   НастройкиКлиента.ВариантИнтерфейсаКлиентскогоПриложения = ВариантИнтерфейсаКлиентскогоПриложения.Такси;
   ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиКлиентскогоПриложения", , НастройкиКлиента);
  КонецЕсли;
 КонецЕсли;
КонецПроцедуры





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

 НастройкиКлиента  = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиКлиентскогоПриложения");
 ВариантИнтерфейса = ?(ТипЗнч(НастройкиКлиента) = Тип("НастройкиКлиентскогоПриложения"),
  НастройкиКлиента.ВариантИнтерфейсаКлиентскогоПриложения,
  ВариантИнтерфейсаКлиентскогоПриложения.Такси);

 // Помощник перехода с редации 2.0
 Обработки.ПомощникПереходаСРедакции20.ПараметрыРаботыКлиентаПриЗапуске(Параметры);

 // Информация о необходимости обновить конфигурацию
 Параметры.Вставить("ПоказатьПредложитьОбновитьВерсиюПрограммы", ПредлагатьОбновитьВерсиюПрограммы(Параметры));

 // Предложение включить основной интерфейс
 ВариантПредложения = Неопределено;
 Параметры.Вставить("ПоказатьВключитьОсновнойИнтерфейс",
  ПредлагатьВключитьОсновнойИнтерфейс(ВариантИнтерфейса, ВариантПредложения));
 Параметры.Вставить("ВариантПредложенияВключитьОсновнойИнтерфейс", ВариантПредложения);

 // Начало работы в сервисе Бизнес-Старт и Предприниматель 2015
 ПоказатьНачалоРаботыПредпринимательВСервисе = ПолучитьФункциональнуюОпцию("ПредпринимательВСервисе")
  И РольДоступна("ПолныеПрава")
  И ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НачалоРаботыПредпринимательВСервисе", "Показывать", Истина);
 Параметры.Вставить("ПоказатьНачалоРаботыПредпринимательВСервисе", ПоказатьНачалоРаботыПредпринимательВСервисе);
 // Знакомство с редакцией 3.0
 ПоказатьЗнакомствоСРедакциейВ30 = ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()
  И ОбновлениеСПредыдущейРедакции.ИнформационнаяБазаОбновленаС20()
  И ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НачалоРаботыВ30", "Показывать", Истина);

 ИмяОбработкиЗнакомствоСРедакциейВ30 = "";
 Если ПоказатьЗнакомствоСРедакциейВ30 Тогда

  ИмяОбработкиЗнакомствоСРедакциейВ30 = ?(
   ВариантИнтерфейса = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2,
   "НачинаемРаботатьВ30_82",
   "НачинаемРаботатьВ30");

  Если Не ПравоДоступа("Использование", Метаданные.Обработки[ИмяОбработкиЗнакомствоСРедакциейВ30]) Тогда
   ПоказатьЗнакомствоСРедакциейВ30 = Ложь;
  КонецЕсли;

 КонецЕсли;

 Параметры.Вставить("ПоказатьЗнакомствоСРедакциейВ30",     ПоказатьЗнакомствоСРедакциейВ30);
 Параметры.Вставить("ИмяОбработкиЗнакомствоСРедакциейВ30", ИмяОбработкиЗнакомствоСРедакциейВ30);

 // Путеводитель по демо-базе
 ИмяОбработкиПутеводительПоДемоБазе = ИмяОбработкиПутеводительПоДемоБазе();
 ПоказатьПутеводительПоДемоБазе = ИмяОбработкиПутеводительПоДемоБазе <> Неопределено;
 Параметры.Вставить("ПоказатьПутеводительПоДемоБазе",     ПоказатьПутеводительПоДемоБазе);
 Параметры.Вставить("ИмяОбработкиПутеводительПоДемоБазе", ИмяОбработкиПутеводительПоДемоБазе);

 // Свертка базы (продолжение работы)
 Параметры.Вставить("ПоказатьСвертку", ТребуетсяОткрытьСверткуБазы());

 // Разрешение на открытие окон при запуске
 Параметры.Вставить("ОткрыватьДополнительныеОкнаПриЗапуске", ОткрыватьДополнительныеОкнаПриЗапуске());

 УстановитьСведенияОРекомендуемойВерсииПлатформы(Параметры);

 УстановитьПараметрыНачалаРаботы(Параметры);

КонецПроцедуры


// Установка набора видимых подсистем командного интерфейса
// и настроек всем пользователям вида интерфейса (Такси / в закладках).
//
// Параметры:
//  Режим - Строка - ИнтерфейсТакси / ИнтерфейсВерсии82 / ИнтерфейсВерсии77 - соответствует константе, которая будет установлена в Истину
//
Процедура УстановитьРежимКомандногоИнтерфейса(Режим) Экспорт

 Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
  Возврат;
 КонецЕсли;

 // Установка констант

 РежимТакси = ВРег(Режим) = ВРег("ИнтерфейсТакси");
 Режим82    = ВРег(Режим) = ВРег("ИнтерфейсВерсии82");
 Режим77    = ВРег(Режим) = ВРег("ИнтерфейсВерсии77");

 Если НЕ РежимТакси
  И НЕ Режим82
  И НЕ Режим77 Тогда
  Возврат;
 КонецЕсли;

 УстановитьПривилегированныйРежим(Истина);

 РежимСоответствуетТекущему = РежимТакси = Константы.ИнтерфейсТакси.Получить()
  ИЛИ Режим82 = Константы.ИнтерфейсВерсии82.Получить()
  ИЛИ Режим77 = Константы.ИнтерфейсВерсии82.Получить();

 Константы.ИнтерфейсТакси.Установить(РежимТакси);
 Константы.ИнтерфейсВерсии82.Установить(Режим82);
 Константы.ИнтерфейсВерсии77.Установить(Режим77);

 ОтображатьПодсистемуУчетаЗарплатыИКадров = УчетЗарплаты.ИспользуетсяПодсистемаУчетаЗарплатыИКадров();

 Константы.ОтображатьПодсистемуСотрудникиИЗарплата82.Установить(ОтображатьПодсистемуУчетаЗарплатыИКадров И Режим82);
 Константы.ОтображатьПодсистемуЗарплатаИКадры.Установить(ОтображатьПодсистемуУчетаЗарплатыИКадров И РежимТакси);

 ЭтоБазоваяВерсияКонфигурации = СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации();

 ВестиУчетПоОрганизациям = Константы.ВестиУчетПоОрганизациям.СоздатьМенеджерЗначения();
 ВестиУчетПоОрганизациям.Значение = НЕ ЭтоБазоваяВерсияКонфигурации И РежимТакси;
 ВестиУчетПоОрганизациям.ОбменДанными.Загрузка = Истина;
 ВестиУчетПоОрганизациям.Записать();

 ВестиУчетПоОрганизациям82 = Константы.ВестиУчетПоОрганизациям82.СоздатьМенеджерЗначения();
 ВестиУчетПоОрганизациям82.Значение = НЕ ЭтоБазоваяВерсияКонфигурации И НЕ РежимТакси;
 ВестиУчетПоОрганизациям82.ОбменДанными.Загрузка = Истина;
 ВестиУчетПоОрганизациям82.Записать();

 // Установка настроек по умолчанию всем пользователям

 ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
 НовыйИнтерфейсПользователей = ?(РежимТакси, ВариантИнтерфейсаКлиентскогоПриложения.Такси,
  ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2);

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

КонецПроцедуры




Функция ЭтоБазоваяВерсияКонфигурации() Экспорт
 Возврат СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации();
КонецФункции
Функция ЭтоКОРПВерсияКонфигурации() Экспорт
 Возврат СтрНайти(ВРег(Метаданные.Имя), "КОРП") > 0;
КонецФункции
Функция ЭтоПрофВерсияКонфигурации() Экспорт
 Возврат НЕ (ЭтоБазоваяВерсияКонфигурации() ИЛИ ЭтоКОРПВерсияКонфигурации())

КонецФункции



// Подтверждает, что переданная организация входит в список доступных для пользователя.
//
// Параметры:
//  Организация  - СправочникСсылка.Организации - проверяемая организация. Может быть пустым значением.
//  ВключатьОбособленныеПодразделения - Булево - признак добавления в список доступных обособленных подразделений.
// ПравоНаИзменение - Булево - Истина, если список будет использоваться в алгоритмах изменения данных.
//
// Возвращаемое значение:
//   Массив      - список из всех доступных, если было передано пустое значение;
//               - список из Организация и её доступных обособленных подразделений;
//               - пустой список, если организация недоступна для пользователя.
//
Функция СписокДоступныхОрганизаций(Организация, ВключатьОбособленныеПодразделения = Ложь, ПравоНаИзменение = Ложь) Экспорт

 ДоступныеОрганизации = ОбщегоНазначенияБПВызовСервераПовтИсп.ВсеОрганизацииДанныеКоторыхДоступныПоRLS(ПравоНаИзменение);

 Если ЗначениеЗаполнено(Организация) Тогда // проверяем конкретную организацию

  Если ВключатьОбособленныеПодразделения
     И ПолучитьФункциональнуюОпцию("ВестиУчетПоПодразделениям") Тогда

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

  Иначе

   СписокОрганизаций = Новый Массив;

  КонецЕсли;

  Если ДоступныеОрганизации.Найти(Организация) <> Неопределено
     И СписокОрганизаций.Найти(Организация) = Неопределено Тогда
   СписокОрганизаций.Вставить(0, Организация);
  КонецЕсли;

  ДоступныеОрганизации = СписокОрганизаций;

 КонецЕсли;

 Возврат ДоступныеОрганизации;

КонецФункции
#КонецОбласти



////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПРОВЕРКИ НЕОБХОДИМОСТИ ВЫПОЛНЕНИЯ ДЕЙСТВИЙ ПРИ ЗАПУСКЕ
Функция ПредлагатьВключитьОсновнойИнтерфейс(ВариантИнтерфейса, ВариантПредложения)
 Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
  Возврат Ложь;
 КонецЕсли;

 Интерфейс77 = Константы.ИнтерфейсВерсии77.Получить();
 Интерфейс82 = Константы.ИнтерфейсВерсии82.Получить();

 Если НЕ Интерфейс77 И НЕ Интерфейс82 Тогда
  Возврат Ложь;
 КонецЕсли;

 ДатаСменыИнтерфейса = ХранилищеОбщихНастроек.Загрузить(ВРег("ДатаСменыИнтерфейса"));
 Если ЗначениеЗаполнено(ДатаСменыИнтерфейса)
  И ТипЗнч(ДатаСменыИнтерфейса) = Тип("Дата")
  И НачалоДня(ТекущаяДатаСеанса()) >= НачалоДня(ДатаСменыИнтерфейса) Тогда
  ДнейСПоследнегоПоказа = (НачалоДня(ТекущаяДатаСеанса()) - НачалоДня(ДатаСменыИнтерфейса)) / (60*60*24);
 Иначе
  ДнейСПоследнегоПоказа = 99999;
 КонецЕсли;

 НадоПредлагать = (Интерфейс77 И ДнейСПоследнегоПоказа >= 7)
  ИЛИ (Интерфейс82 И ДнейСПоследнегоПоказа >= 14);

 Если НадоПредлагать Тогда
   ВариантПредложения = ?(ВариантИнтерфейса = ВариантИнтерфейсаКлиентскогоПриложения.Такси,
    "ИзменитьКомандныйИнтерфейс", "ВключитьСтандартныйИнтерфейс");
 КонецЕсли;

 Возврат НадоПредлагать;
КонецФункции




Функция ПредлагатьОбновитьВерсиюПрограммы(Параметры)

 Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
  Возврат Ложь;
 КонецЕсли;

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

КонецФункции





// Возвращает имя внешней обработки путеводителя по демо-базе или пустое значение, если путеводитель запускать не требуется
//
Функция ИмяОбработкиПутеводительПоДемоБазе()

 Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
  Возврат Неопределено;
 КонецЕсли;
 Если Не ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда
  Возврат Неопределено;
 КонецЕсли;

 ПоказыватьПриСтарте = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПутеводительПоДемоБазе", "Показывать", Истина);

 Если НЕ ПоказыватьПриСтарте Тогда
  Возврат Неопределено;
 КонецЕсли;

 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
 | ВнешниеОбработки.Ссылка
 |ИЗ
 | Справочник.ДополнительныеОтчетыИОбработки КАК ВнешниеОбработки
 |ГДЕ
 | ВнешниеОбработки.ИмяОбъекта = &ИмяОбъекта";

 Запрос.УстановитьПараметр("ИмяОбъекта", "ПутеводительПоДемонстрационнойБазе");

 Выборка = Запрос.Выполнить().Выбрать();

 Если Выборка.Следующий() Тогда
  Возврат ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Выборка.Ссылка);
 Иначе
  Возврат Неопределено;
 КонецЕсли;

КонецФункции




// Возвращает значение: требуется ли запускать обработку "Свертка информационной базы" или нет.
//
Функция ТребуетсяОткрытьСверткуБазы()

 Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
  Возврат Ложь;
 КонецЕсли;

 Если Не РольДоступна("ПолныеПрава") Тогда
  Возврат Ложь;
 КонецЕсли;

 ЗначениеХранилища = Константы.СтатусСверткиИнформационнойБазы.Получить();

 ПоказыватьПриСтарте = Ложь;

 Если ЗначениеХранилища <> Неопределено Тогда
  Статус = ЗначениеХранилища.Получить();
  Если Статус <> Неопределено Тогда
   ПоказыватьПриСтарте = Статус.ПоказыватьПриСтарте;
  КонецЕсли;
 Иначе
  ПоказыватьПриСтарте = Ложь;
 КонецЕсли;

 Возврат ПоказыватьПриСтарте;

КонецФункции




Функция ОткрыватьДополнительныеОкнаПриЗапуске() Экспорт

 Если Не ПравоДоступа("Чтение", Метаданные.Справочники.Организации) Тогда
  // Дополнительные окна предназначены только для регулярных пользователей
  Возврат Ложь;
 КонецЕсли;

 Запрос = Новый Запрос();
 Запрос.Текст =
 "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
 | Организация.Ссылка
 |ИЗ
 | Справочник.Организации КАК Организация";

 Если НЕ Запрос.Выполнить().Пустой() Тогда
  Возврат Истина;
 Иначе
  Возврат Ложь;
 КонецЕсли;

КонецФункции
Процедура УстановитьСведенияОРекомендуемойВерсииПлатформы(Параметры)

 КонфигурацияМоделиСервиса = ОбщегоНазначенияПовтИсп.РазделениеВключено()
  Или ПолучитьФункциональнуюОпцию("РаботаВАвтономномРежиме");

 Если КонфигурацияМоделиСервиса Тогда
  Возврат;
 КонецЕсли;

 Если Пользователи.ЭтоПолноправныйПользователь(,Истина) Тогда

  РекомендуемаяВерсия = "8.3.8";
  РекомендуемаяВерсияДляПроверки = "8.3.8.0";

  СистемнаяИнформация = Новый СистемнаяИнформация;
  СообщитьОРекомендуемойВерсииПлатформы =
    ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, РекомендуемаяВерсияДляПроверки) < 0;

  Если СообщитьОРекомендуемойВерсииПлатформы Тогда
   Параметры.Вставить("СообщитьОРекомендуемойВерсииПлатформы", Ложь);
   Параметры.Вставить("РекомендуемаяВерсияПлатформы", РекомендуемаяВерсия);
   Параметры.Вставить("ТекстСообщенияОРекомендуемойВерсииПлатформы",
     НСтр("ru='Для работы с версией 3.0.44 конфигурации ""Бухгалтерии предприятия"" необходимо использовать версию платформы 8.3.8'"));
   
  КонецЕсли;

 КонецЕсли;

КонецПроцедуры
Процедура УстановитьПараметрыНачалаРаботы(Параметры)

 ПоказыватьБыстрыйСтарт = ПолучитьФункциональнуюОпцию("НачалоРаботы")
  И ОбщегоНазначенияБПВызовСервера.ПроверитьНаличиеДоступныхОрганизаций();

 Параметры.Вставить("ПоказыватьБыстрыйСтарт", ПоказыватьБыстрыйСтарт);

КонецПроцедуры





////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПРОВЕРКИ НАЛИЧИЯ И ЗАПОЛНЕНИЯ РЕВИЗИТОВ
// Позволяет определить есть ли табличная часть документа с переданным именем.
//
// Параметры:
//  ИмяТабЧасти - строковое имя искомой табличной части,
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьТабЧастьДокумента(ИмяТабЧасти, МетаданныеДокумента) Экспорт
 Возврат НЕ (МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти) = Неопределено);

КонецФункции // ЕстьТабЧастьДокумента()





// Позволяет определить есть ли среди реквизитов табличной части документа
// реквизит с переданным именем.
//
// Параметры:
//  ИмяРеквизита - строковое имя искомого реквизита,
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//  ИмяТабЧасти  - строковое имя табличной части документа, среди реквизитов которого производится поиск
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт
 ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);
 Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе
  Возврат Ложь;
 Иначе
  Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
 КонецЕсли;
КонецФункции // ЕстьРеквизитТабЧастиДокумента()





// Позволяет определить заполнен ли реквизит в документе.
//
// Параметры:
//  ИмяРеквизита - Строка - Строковое имя искомого реквизита.
//  ДокументОбъект - ДокументОбъект - Объект, в котором проверяется заполненность реквизита.
//  МетаданныеДокумента - Метаданные - Объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Булево.
//
Функция ЕстьНезаполненныйРеквизитДокумента(ИмяРеквизита, ДокументОбъект, МетаданныеДокумента) Экспорт
 Результат =
  ОбщегоНазначения.ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеДокумента)
  И НЕ ЗначениеЗаполнено(ДокументОбъект[ИмяРеквизита]);
 Возврат Результат;
КонецФункции
Функция ЕстьНезаполненныйРеквизитТабЧастиДокумента(ИмяРеквизита, СтрокаТабЧасти, МетаданныеДокумента, ИмяТабЧасти) Экспорт
 Результат =
  ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти)
    И НЕ ЗначениеЗаполнено(СтрокаТабЧасти[ИмяРеквизита]);
 Возврат Результат;
КонецФункции





// Удаляет из списка проверяемых реквизитов табличные части, если хотя бы одна из них заполнена
//
// Параметры:
//  Объект - ДокументОбъект, СправочникОбъект - объект с табличными частями
//  ИменаТабличныхЧастей - Массив, Строка - Перечень имен проверяемых табличных частей
//  ПроверяемыеРеквизиты - Массив - Перечень проверяемых реквизитов
Процедура ИсключитьИзПроверкиОсновныеТабличныеЧасти(Объект, Знач ИменаТабличныхЧастей, ПроверяемыеРеквизиты) Экспорт

 МассивНепроверяемыхРеквизитов = Новый Массив;

 Если ТипЗнч(ИменаТабличныхЧастей) = Тип("Строка") Тогда
  ИменаТабличныхЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаТабличныхЧастей);
 КонецЕсли;

 ЕстьЗаписи = Ложь;
 Для Каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл

  Если Объект[СокрЛП(ИмяТабличнойЧасти)].Количество() > 0 Тогда
   ЕстьЗаписи = Истина;
   Прервать;
  КонецЕсли;

 КонецЦикла;

 Если ЕстьЗаписи Тогда
  Для Каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл
   МассивНепроверяемыхРеквизитов.Добавить(СокрЛП(ИмяТабличнойЧасти));
  КонецЦикла;
 КонецЕсли;

 ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);

КонецПроцедуры





// Удаляет из списка проверяемых реквизитов неиспользуемые табличные части и все их реквизиты
//
// Параметры:
//  ПроверяемыеРеквизиты - Массив - Перечень проверяемых реквизитов
//  НеИспользуемыеТабличныеЧасти - Массив - Перечень имен неиспользуемых табличных частей
Процедура ИсключитьИзПроверкиНеиспользуемыеТабличныеЧасти(ПроверяемыеРеквизиты, НеИспользуемыеТабличныеЧасти) Экспорт

 // Исключим из проверки сами списки
 ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НеИспользуемыеТабличныеЧасти);

 // Исключим из проверки колонки списков

 МассивНепроверяемыхРеквизитов = Новый Массив;

 Для Каждого ИмяТабличнойЧасти Из НеИспользуемыеТабличныеЧасти Цикл
  ПрефиксРеквизита = ИмяТабличнойЧасти + ".";
  ДлинаПрефикса = СтрДлина(ПрефиксРеквизита);
  Для Каждого ПроверяемыйРеквизит Из ПроверяемыеРеквизиты Цикл
   Если СтрДлина(ПроверяемыйРеквизит) > ДлинаПрефикса
      И Лев(ПроверяемыйРеквизит, ДлинаПрефикса) = ПрефиксРеквизита Тогда
      МассивНепроверяемыхРеквизитов.Добавить(ПроверяемыйРеквизит);
   КонецЕсли;
  КонецЦикла;
 КонецЦикла;

 ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);

КонецПроцедуры




Процедура ОчиститьНеиспользуемыеТабличныеЧасти(Объект, ИменаТабличныхЧастей) Экспорт

 Для Каждого ИмяТабличнойЧасти Из ИменаТабличныхЧастей Цикл

  ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];

  Если ТабличнаяЧасть.Количество() = 0 Тогда
   Продолжить;
  КонецЕсли;

  ТабличнаяЧасть.Очистить();

 КонецЦикла;

КонецПроцедуры




// Возвращает значение второго параметра в случае, если значение первого параметра NULL.
// В противном случае будет возвращено значение первого параметра
//
// Параметры:
//  ПроверяемоеЗначение  - произвольный тип - проверяемое значение
//  ВозвращаемоеЗначение - произвольный тип - возвращаемое значение, если значение ПроверяемоеЗначение есть NULL
//
// Возвращаемое значение:
//  ПроверяемоеЗначение - если его значение не NULL, ВозвращаемоеЗначение - в ином случае.
//
Функция ЕстьNull(Знач ПроверяемоеЗначение, ВозвращаемоеЗначение) Экспорт

 Если ПроверяемоеЗначение = Null Тогда
  Возврат ВозвращаемоеЗначение;
 Иначе
  Возврат ПроверяемоеЗначение;
 КонецЕсли;

КонецФункции




///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПОЛУЧЕНИЯ И УСТАНОВКИ НАСТРОЕК ПОЛЬЗОВАТЕЛЕЙ
// Устарела. Необходимо использовать функцию БСП ОбщегоНазначения.ТекущаяДатаПользователя()
//
Функция ПолучитьРабочуюДату() Экспорт

 Возврат ОбщегоНазначения.ТекущаяДатаПользователя();

КонецФункции





// Определяет конфигурации с основной функциональностью
//
// Возвращаемое значение:
//  Булево
//
Функция ЭтоВерсияСОсновнойФункциональностью() Экспорт

 Возврат ОбщегоНазначенияПовтИсп.РазделениеВключено() ИЛИ СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации();

КонецФункции





////////////////////////////////////////////////////////////////////////////////
// Замена ссылок по информационной базе
// Принимает Соответствие между замещаемыми ссылками и заменителями и заменяет ссылки по информационной базе
Процедура ЗаменитьСсылки(ПарыЗамен) Экспорт
 ДвиженияССубконтоИмя = ?(Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Английский,
  ".RecordsWithExtDimensions", ".ДвиженияССубконто");

 ЗаменяемыеСсылки = Новый Массив;
 Для Каждого Пара Из ПарыЗамен Цикл
  ЗаменяемыеСсылки.Добавить(Пара.Ключ);
 КонецЦикла;
 РезультатыПоиска = НайтиПоСсылкам(ЗаменяемыеСсылки);
 // (.Ссылка: исходная ссылка; .Данные: ссылающийся объект; .Метаданные: метаданные ссылающегося объекта)
 КешПолей = Новый Соответствие;
  Для Каждого Результат Из РезультатыПоиска Цикл
  Замещаемое = Результат.Ссылка;
  // объект, ссылающийся сам на себя не трогаем!
  Если Замещаемое = Результат.Данные Тогда
   Продолжить;
  КонецЕсли;

  ТипЗамещаемого = ТипЗнч(Замещаемое);
  Заменитель = ПарыЗамен[Результат.Ссылка];

  Если ЭтоСсылочныйОбъектМетаданных(Результат.Метаданные) Тогда
   // обработка самого объекта
   ОбъектДанных = Результат.Данные.ПолучитьОбъект();
   ИменаПолей = ИменаПолейСТипом(Результат.Метаданные.ПолноеИмя(), ТипЗамещаемого, КешПолей, "Ссылка, Ref");
   ЗаменитьЗначение(ОбъектДанных, ИменаПолей, Замещаемое, Заменитель);
   // обработка табчастей объекта
   Для Каждого Табчасть Из Результат.Метаданные.ТабличныеЧасти Цикл
    ИменаПолей = ИменаПолейСТипом(Результат.Метаданные.ПолноеИмя()+"."+Табчасть.Имя, ТипЗамещаемого, КешПолей, "Ссылка, Ref");
    Для Каждого Табстрока Из ОбъектДанных[Табчасть.Имя] Цикл
     ЗаменитьЗначение(Табстрока, ИменаПолей, Замещаемое, Заменитель);
    КонецЦикла;
   КонецЦикла;
   // обработка стандартных табчастей объекта
   Если Метаданные.ПланыСчетов.Содержит(Результат.Метаданные) Или Метаданные.ПланыВидовРасчета.Содержит(Результат.Метаданные) Тогда
    Для Каждого Табчасть Из Результат.Метаданные.СтандартныеТабличныеЧасти Цикл
     ИменаПолей = ИменаПолейСТипом(Результат.Метаданные.ПолноеИмя()+"."+Табчасть.Имя, ТипЗамещаемого, КешПолей, "Ссылка, Ref");
     Для Каждого Табстрока Из ОбъектДанных[Табчасть.Имя] Цикл
      ЗаменитьЗначение(Табстрока, ИменаПолей, Замещаемое, Заменитель);
     КонецЦикла;
    КонецЦикла;
   КонецЕсли;
   ЗаписатьДанные(ОбъектДанных);
   ОбъектДанных = Неопределено;
   // обработка движений документа
   Если Метаданные.Документы.Содержит(Результат.Метаданные) Тогда
    Для Каждого Движение Из Результат.Метаданные.Движения Цикл
     Если Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда
      ДопТаблица = ДвиженияССубконтоИмя;
      Регистр = РегистрыБухгалтерии[Движение.Имя];
      ИменаПолей = ИменаПолейСТипом(Движение.ПолноеИмя(), ТипЗамещаемого, КешПолей, "Регистратор, Recorder");
      Набор = НаборЗаписей(Регистр, Новый Структура("Регистратор", Результат.Данные));
      ЗначениеЗаменено = Ложь;
      Для Каждого Запись Из Набор Цикл
       ЗаменитьЗначение(Запись, ИменаПолей, Замещаемое, Заменитель, ЗначениеЗаменено);
       ЗаменыЗначенийСубконто = Новый Соответствие();
       Для Каждого Субконто ИЗ Запись.СубконтоДт Цикл
        Если Субконто.Значение = Замещаемое Тогда
         ЗаменыЗначенийСубконто.Вставить(Субконто.Ключ, Заменитель);
        КонецЕсли;
       КонецЦикла;
       Для Каждого Замена Из ЗаменыЗначенийСубконто Цикл
        Запись.СубконтоДт.Вставить(Замена.Ключ, Замена.Значение);
       КонецЦикла;
       ЗаменыЗначенийСубконто.Очистить();
       Для Каждого Субконто ИЗ Запись.СубконтоКт Цикл
        Если Субконто.Значение = Замещаемое Тогда
         ЗаменыЗначенийСубконто.Вставить(Субконто.Ключ, Заменитель);
        КонецЕсли;
       КонецЦикла;
       Для Каждого Замена Из ЗаменыЗначенийСубконто Цикл
        Запись.СубконтоКт.Вставить(Замена.Ключ, Замена.Значение);
       КонецЦикла;
      КонецЦикла;
   
      ЗаписатьДанные(Набор, ЗначениеЗаменено);
   
     Иначе
      Если Метаданные.РегистрыНакопления.Содержит(Движение) Тогда
       Регистр = РегистрыНакопления[Движение.Имя];
      ИначеЕсли Метаданные.РегистрыСведений.Содержит(Движение) Тогда
       Регистр = РегистрыСведений[Движение.Имя];
      ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда
       Регистр = РегистрыРасчета[Движение.Имя];
      КонецЕсли;
      ИменаПолей = ИменаПолейСТипом(Движение.ПолноеИмя(), ТипЗамещаемого, КешПолей, "Регистратор, Recorder");
      Набор = НаборЗаписей(Регистр, Новый Структура("Регистратор", Результат.Данные));
      ЗначениеЗаменено = Ложь;
      Для Каждого Запись Из Набор Цикл
       ЗаменитьЗначение(Запись, ИменаПолей, Замещаемое, Заменитель, ЗначениеЗаменено);
      КонецЦикла;
      ЗаписатьДанные(Набор, ЗначениеЗаменено);
     КонецЕсли;
    КонецЦикла;
    // обработка последовательностей, включающих документ
    Для Каждого Последовательность Из Метаданные.Последовательности Цикл
     Если Последовательность.Документы.Содержит(Результат.Метаданные) Тогда
      ИменаПолей = ИменаПолейСТипом(Последовательность.ПолноеИмя(), ТипЗамещаемого, КешПолей, "Регистратор, Recorder");
      Набор = НаборЗаписей(Последовательности[Последовательность.Имя], Новый Структура("Регистратор", Результат.Данные));
      Для Каждого Запись Из Набор Цикл
       ЗаменитьЗначение(Запись, ИменаПолей, Замещаемое, Заменитель);
      КонецЦикла;
      ЗаписатьДанные(Набор);
     КонецЕсли;
    КонецЦикла;
   КонецЕсли;
  // константы
  ИначеЕсли Метаданные.Константы.Содержит(Результат.Метаданные) Тогда
   Константы[Результат.Метаданные.Имя].Установить(Заменитель);
  // регистры сведений (необъектные таблицы)
  ИначеЕсли Метаданные.РегистрыСведений.Содержит(Результат.Метаданные) Тогда
   ИменаПолей = ИменаПолейСТипом(Результат.Метаданные.ПолноеИмя(), ТипЗамещаемого, КешПолей);
   Отборы = ОтборыРегистраСведений(Результат.Метаданные, Результат.Данные);
   Набор = НаборЗаписей(РегистрыСведений[Результат.Метаданные.Имя], Отборы);

   Таблица = Набор.Выгрузить();
   Набор.Очистить();
   ЗаписатьДанные(Набор);
   ЗаменитьЗначение(Таблица[0], ИменаПолей, Замещаемое, Заменитель);
   Для Каждого ИмяПоля Из ИменаПолей Цикл
    Если Отборы.Свойство(ИмяПоля) И Отборы[ИмяПоля] = Замещаемое Тогда
     Набор.Отбор[ИмяПоля].Установить(Заменитель);
    КонецЕсли
   КонецЦикла;
   Набор.Загрузить(Таблица);
   ЗаписатьДанные(Набор);
  КонецЕсли;
 КонецЦикла;

КонецПроцедуры




Функция ИменаПолейСТипом(ИмяТаблицы, ТипДанных, КешПолейТаблиц=Неопределено, СтрокаИсключений=Неопределено)
 ИменаПолей = Новый Массив;

 ТекстЗапроса = СтрЗаменить("ВЫБРАТЬ Т.* ИЗ ТаблицаВыборки КАК Т ГДЕ Ложь", "ТаблицаВыборки", ИмяТаблицы);
 Если Неопределено<>КешПолейТаблиц Тогда
  ПоляТаблицы = КешПолейТаблиц.Получить(ИмяТаблицы);
  Если Неопределено=ПоляТаблицы Тогда
   Запрос = Новый Запрос(ТекстЗапроса);
   ПоляТаблицы = Запрос.Выполнить().Колонки;
   КешПолейТаблиц.Вставить(ИмяТаблицы, ПоляТаблицы);
  КонецЕсли;
 Иначе
  Запрос = Новый Запрос(ТекстЗапроса);
  ПоляТаблицы = Запрос.Выполнить().Колонки;
 КонецЕсли;

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

    Возврат ИменаПолей;
КонецФункции




Процедура ЗаменитьЗначение(Данные, ИменаПолей, Замещаемое, Заменитель, ЗначениеЗаменено=Ложь)
 Для Каждого ИмяПоля Из ИменаПолей Цикл
  Если Данные[ИмяПоля] = Замещаемое Тогда
   Данные[ИмяПоля] = Заменитель;
   ЗначениеЗаменено = Истина;
  КонецЕсли;
 КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьДанные(Данные, Принудительно=Ложь)
 Если Данные.Модифицированность() Или Принудительно Тогда
  Данные.ОбменДанными.Загрузка = Истина;
  Данные.Записать();
 КонецЕсли;
КонецПроцедуры
Функция ОтборыРегистраСведений(МетаданныеРегистра, Запись)
 Отборы = Новый Структура;
 Если МетаданныеРегистра.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
  Отборы.Вставить("Период", Запись.Период);
 КонецЕсли;
 Для Каждого Измерение Из МетаданныеРегистра.Измерения Цикл
  Отборы.Вставить(Измерение.Имя, Запись[Измерение.Имя]);
 КонецЦикла;
 Возврат Отборы;
КонецФункции
Функция НаборЗаписей(МенеджерРегистра, Отборы)
 Набор = МенеджерРегистра.СоздатьНаборЗаписей();
 Для Каждого Отбор Из Отборы Цикл
  Набор.Отбор[Отбор.Ключ].Установить(Отбор.Значение);
 КонецЦикла;
 Набор.Прочитать();
 Возврат Набор;
КонецФункции
Функция ЭтоСсылочныйОбъектМетаданных(ОбъектМетаданных)
 Возврат Метаданные.Справочники.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.Перечисления.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных)
  //ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип)
  ИЛИ Метаданные.Задачи.Содержит(ОбъектМетаданных)
  ИЛИ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных);
КонецФункции




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

 Если Отборы.Количество() = 0 Тогда
  Возврат;
 КонецЕсли;

 ЭлементОтбора = Отборы[0];
 ИдентификаторНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;

 Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
  Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных")
   И ЭлементНастроек.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
   ЭлементНастроек.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
   ЭлементНастроек.Использование  = ЭлементОтбора.Использование;
   Прервать;
  КонецЕсли;
 КонецЦикла;
КонецПроцедуры




///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С СОХРАНЕНИЕМ И ОТПРАВКОЙ ДОКУМЕНТОВ ПО ЭЛ.ПОЧТЕ
// Процедура формирует имя сохраняемого файла путем формирования представления документа и удаления из него символов "точка"
Процедура УстановитьИмяСохраняемогоФайла(ОбъектыПечати, КоллекцияПечатныхФорм)

 Если НЕ КоллекцияПечатныхФорм.Количество() = 1 Тогда
  Возврат;
 КонецЕсли;

 ПечатнаяФорма = КоллекцияПечатныхФорм[0];
 ИмяФайлаПечатнойФормы = Новый Соответствие;

 Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
  ПредставлениеДокументаДляПечатнойФормы = ОбщегоНазначенияБПВызовСервера.СформироватьЗаголовокДокумента(
   ОбъектПечати.Значение, ПечатнаяФорма.СинонимМакета);
  ПредставлениеДокументаДляПечатнойФормы = СтрЗаменить(ПредставлениеДокументаДляПечатнойФормы, ".", "");
  ИмяФайлаПечатнойФормы.Вставить(ОбъектПечати.Значение, ПредставлениеДокументаДляПечатнойФормы);
 КонецЦикла;

 ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;

КонецПроцедуры



// Устанавливает имя сохраняемого файла.
//
// Параметры:
//  МассивОбъектов - Массив - Массив объектов печати.
//  КоллекцияПечатныхФорм - Массив - Коллекция печатных форм.
//  ОбъектыПечати - Массив - Массив объектов печати.
//  ПараметрыВывода - Структура - Параметры вывода печатной формы.
//
Процедура ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати,
   ПараметрыВывода = Неопределено) Экспорт

 Если ТипЗнч(ПараметрыВывода) = Тип("Структура") И ПараметрыВывода.Свойство("НеПереопределятьИмяФайла") Тогда
  Возврат;
 КонецЕсли;

 УстановитьИмяСохраняемогоФайла(ОбъектыПечати, КоллекцияПечатныхФорм);

КонецПроцедуры



////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ СО СТАТУСОМ ДОКУМЕНТОВ
// Позволяет получить индекс картинки состояния документа из коллекции СостоянияДокумента
// по свойствам Проведен/ПометкаУдаления/РучнаяКорректировка
//
// Параметры:
// Объект - основной реквизит формы документа, с типом ДанныеФормыСтруктура
//
Функция СостояниеДокумента(Объект) Экспорт

 РучнаяКорректировка = Неопределено;

 Если Объект.Свойство("РучнаяКорректировка", РучнаяКорректировка) Тогда
  Если Объект.РучнаяКорректировка Тогда
   Если Объект.ПометкаУдаления Тогда
    СостояниеДокумента = 10;
   ИначеЕсли НЕ Объект.Проведен Тогда
    СостояниеДокумента = 9;
   Иначе
    СостояниеДокумента = 8;
   КонецЕсли;
  Иначе
   Если Объект.ПометкаУдаления Тогда
    СостояниеДокумента = 2;
   ИначеЕсли Объект.Проведен Тогда
    СостояниеДокумента = 1;
   Иначе
    СостояниеДокумента = 0;
   КонецЕсли;
  КонецЕсли;
 Иначе
  Если Объект.ПометкаУдаления Тогда
   СостояниеДокумента = 2;
  ИначеЕсли Объект.Проведен Тогда
   СостояниеДокумента = 1;
  Иначе
   СостояниеДокумента = 0;
  КонецЕсли;
 КонецЕсли;

 Возврат СостояниеДокумента;
КонецФункции


#Область УстаревшийПрограммныйИнтерфейс
// Устарела. Следует использовать ОбщегоНазначения.ЕстьРеквизитОбъекта
// Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры:
//  ИмяРеквизита - строковое имя искомого реквизита,
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт
 Возврат НЕ (МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
КонецФункции // ЕстьРеквизитДокумента()
#КонецОбласти




////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ПЛАНАМИ ОБМЕНА
// Проверяет, используются ли планы обмена.
// Параметры:
//  ОтборРаспределеннаяИнформационнаяБаза - <Булево> - Если Истина, то проверяются
//  только распределенные информационные базы, если Ложь, то обмены с другими
//  программами.
Функция ИспользуютсяПланыОбмена(ОтборРаспределеннаяИнформационнаяБаза) Экспорт
     
     Результат = Ложь;
     
     ПланыОбменаПодсистемы = Новый Массив;
     ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(ПланыОбменаПодсистемы);
 
  Для каждого ПланОбмена Из ПланыОбменаПодсистемы Цикл
  
  Если ПланОбмена.РаспределеннаяИнформационнаяБаза <> ОтборРаспределеннаяИнформационнаяБаза Тогда
   Продолжить;
  КонецЕсли;
    
  Запрос = Новый Запрос;
  ТекстЗапроса = 
  "ВЫБРАТЬ
  |     ПроверяемыйПланОбмена.Ссылка
  |ИЗ
  |     ПланОбмена.%1 КАК ПроверяемыйПланОбмена
  |ГДЕ
  |     ПроверяемыйПланОбмена.ПометкаУдаления = ЛОЖЬ И ПроверяемыйПланОбмена.ЭтотУзел = Ложь";
  ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗапроса, ПланОбмена.Имя);
  Запрос.Текст = ТекстЗапроса;
  РезультатЗапроса = Запрос.Выполнить();
  Если НЕ РезультатЗапроса.Пустой() Тогда
     Результат = Истина;
     Прервать;
    КонецЕсли;
   
     КонецЦикла;
     
 Возврат Результат   

КонецФункции




// Устанавливает значения общих констант загрузке данных из сервиса
//
Процедура УстановитьЗначенияКонстантПоставкиПослеЗагрузкиДанных() Экспорт

 Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
  // Значения общих констант устанавливаются при включении разделения по областям данных
  Возврат;
 КонецЕсли;

 Если Константы.ПредпринимательВСервисе.Получить() Тогда
  // Данные загружены из 1С:Предприниматель 2015
  Константы.ПредпринимательВСервисе.Установить(Ложь);
 КонецЕсли;

КонецПроцедуры






// Устанавливает значения общих констант при включении разделения
//
Процедура УстановитьЗначенияКонстантПоставкиПриВключенииРазделенияПоОбластямДанных() Экспорт

 Константы.ПредпринимательВСервисе.Установить(СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации());

КонецПроцедуры



// Обработчик обновления ИБ
//
Процедура ЗаполнитьКонстантуПредпринимательВСервисеПриОбновлении() Экспорт

 Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда // В подчиненных узлах РИБ не выполняется
  Возврат;
 КонецЕсли;

 МенеджерЗначения = Константы.ПредпринимательВСервисе.СоздатьМенеджерЗначения();
 МенеджерЗначения.Значение = ОбщегоНазначенияПовтИсп.РазделениеВключено() И СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации();
 ОбновлениеИнформационнойБазы.ЗаписатьДанные(МенеджерЗначения, Истина);

КонецПроцедуры

Комментариев нет:

Отправить комментарий