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