Вопросы по программе 1с Предприятие

Управление амортизацией устанавливается в Регистре сведений «Начисление амортизации ОС (бухгалтерский учет)» и «Начисление амортизации ОС(налоговый учет) флажок «Начислять амортизацию») Если на начало периода данный флажок установлен, тогда амортизация по объекту ОС в этом периоде будет начисляться, соответственно если данный флажок снять амортизация начисляться не будет. Данный реквизит устанавливается отдельно для бухгалтерского и налогового учета.

Для изменения признака данного флажка используется документ «Изменение состояния ОС». В данном документе необходимо установить флажок «Влияет на начисление амортизации» и установить или оставить не установленным флажок «Начислять амортизацию». При проведении документа будет изменено состояние регистров сведений. Если в документе установлен флажок «Отражать в налоговом учете», то признак начисление амортизации будет изменен для бухгалтерского и налогового учета, если данный флажок снять то только для бухгалтерского.

Новое значение флажка «Начислять амортизацию» будет использовано программой при начислении амортизации в следующем месяце.
Механизм, реализованный в программе «1С:Зарплата и управление персоналом» для автоматизированного учета оценочных обязательств позволяет ежемесячно рассчитывать величину оценочных обязательств процентом от начисленных работникам сумм и отражать оценочные обязательства в учете.
Перечень учитываемых оценочных обязательств описывается в программе в справочнике Оценочные обязательства (резервы) подменю Учет зарплаты -Аналитический учет - Оценочные обязательства и резервы.

Для каждого элемента справочника Оценочные обязательства в программе «1С:Зарплата и управление персоналом 8» указывается список базовых начислений и процент, на основании которого должна рассчитываться сумма оценочного обязательства . Процент задается отдельно для каждой организации. Если процент для организации не задан или равен нулю, то это оценочное обязательство в учете этой организации отражаться не будет.

Для использования возможностей формирования обязательств, необходимо установить следующие значения. Меню сервис-параметры учета-подменю оценочные обязательства.


При отражении расходов на оплату труда оценочные обязательства отражаются по кредиту счета 96.01 «Оценочные обязательства» . Сумма признаваемого оценочного обязательства рассчитывается процентом от результатов базовых начислений за месяц. Дебетовая часть проводки подбирается по результатам отражения в учете сумм начислений, составивших базу для расчета суммы оценочного обязательства, статья затрат при этом может заменяться по настроенным в регистре Соответствие статей затрат отражения зарплаты в регл. учете правилам замены.

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

Например если были начислены отпускные будет сформирована проводка дебет 96.01 кредит 70

Учет оценочных обязательств в НУ устанавливается в зависимости от параметра формировать резервы в налоговом учете по налогу на прибыль при установке данного значение суммы будут формироваться по БУ и НУ, соответственно если данного параметра не устанавливать будут рассчитываться только суммы по БУ и ВР
Если Товары.Количество() > 0 Тогда

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

Товары.Очистить();
КонецЕсли;
Для Каждого ТекущаяСтрока Из Проценты Цикл

//////////

КонецЦикла
В данном примере заказы поставщика закрываются по методу FIFO в момент поступления товара

Запрос=Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Номенклатура,
| СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
| МИНИМУМ(ПоступлениеТоваровУслугТовары.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ДокТабЧасть
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровУслугТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокТабЧасть.Номенклатура КАК Номенклатура,
| ЕСТЬNULL(ДокТабЧасть.Количество, 0) КАК Количество,
| ЗаказыПоставщикамОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
| ЕСТЬNULL(ЗаказыПоставщикамОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ДокТабЧасть.НомерСтроки КАК НомерСтроки,
| ЕСТЬNULL(ЗаказыПоставщикамОстатки.Цена, 0) КАК Цена,
| ЗаказыПоставщикамОстатки.ЕдиницаИзмерения,
| ЗаказыПоставщикамОстатки.СтавкаНДС,
| ЗаказыПоставщикамОстатки.СтатусПартии,
| ЗаказыПоставщикамОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| ДокТабЧасть КАК ДокТабЧасть
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(
| &ДатаОстатков,
| ДоговорКонтрагента = &ДоговорОтбора
| И Номенклатура В
| (ВЫБРАТЬ
| ДокТабЧасть.Номенклатура
| ИЗ
| ДокТабЧасть КАК ДокТабЧасть)) КАК ЗаказыПоставщикамОстатки
| ПО ДокТабЧасть.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ЗаказПоставщику
|ИТОГИ
| МИНИМУМ(Количество),
| СУММА(КоличествоОстаток),
| МИНИМУМ(НомерСтроки)
|ПО
| Номенклатура";

Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("ДатаОстатков",МоментВремени());
Запрос.УстановитьПараметр("ДоговорОтбора",ЭтотОбъект.ДоговорКонтрагента);

Результат=Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда

Движения.ЗаказыПоставщикам.Очистить();

Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");

Пока Выборка.Следующий() Цикл

//Итого количестов по документу и итого остатки по регистуру
СписатьКол=Выборка.Количество;

Если Выборка.Количество>Выборка.КоличествоОстаток Тогда
Сообщить("Не хватает товара: " + Выборка.Номенклатура+ " из необходимых "+
+ Выборка.Количество + " есть только "+ Выборка.КоличествоОстаток);
Отказ=Истина;
КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

ВыборкаПартия=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаПартия.Следующий() И СписатьКол<>0 Цикл

Движение = Движения.ЗаказыПоставщикам.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.ДоговорКонтрагента = ЭтотОбъект.ДоговорКонтрагента;
Движение.Номенклатура=ВыборкаПартия.Номенклатура;
Движение.ЕдиницаИзмерения = ВыборкаПартия.ЕдиницаИзмерения;
Движение.ЗаказПоставщику = ВыборкаПартия.ЗаказПоставщику;
Движение.СтавкаНДС = ВыборкаПартия.СтавкаНДС;
Движение.СтатусПартии = ВыборкаПартия.СтатусПартии;
Движение.Цена = ВыборкаПартия.Цена;

Если ВыборкаПартия.КоличествоОстаток<=СписатьКол Тогда
СписатьКоличествоЗаказа=ВыборкаПартия.КоличествоОстаток;
СуммаСписания= ВыборкаПартия.СуммаВзаиморасчетовОстаток;
Иначе
СписатьКоличествоЗаказа=СписатьКол;
СуммаСписания= ВыборкаПартия.Цена*СписатьКол;
КонецЕсли;

Движение.СуммаУпр = СуммаСписания;
Движение.СуммаВзаиморасчетов = СуммаСписания;
Движение.Количество = СписатьКоличествоЗаказа;
СписатьКол=СписатьКол-СписатьКоличествоЗаказа;
КонецЦикла;

КонецЦикла;
Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| РазмещениеЗаказовПокупателейОбороты.Номенклатура,
| РазмещениеЗаказовПокупателейОбороты.КоличествоПриход
|ИЗ
| РегистрНакопления.РазмещениеЗаказовПокупателей.Обороты(, , Регистратор, ) КАК РазмещениеЗаказовПокупателейОбороты
|ГДЕ
| РазмещениеЗаказовПокупателейОбороты.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", Ссылка);

Результат=Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда
Выборка=Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Номенклатура);

КонецЦикла;

КонецЕсли;
Это проверка в модуле
Если ТипЗнч(Основание) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда

Проверка в запросе
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг)
Необходимо в модуле печати самого документа задать параметр
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
после этого в общие формы, печать документов, в процедуре
При Открытии добавить строку:

//ЭлементыФормы.ПолеТабличногоДокумента.ОриентацияСтраницы
=ПечатныйДокумент.ОриентацияСтраницы;//ЮК
В форме документа делаем реквизит путьКФайлуЗагрузки , в событиях
данного реквизита НачалоВыбора ставим данную процедуру
//*******************************************************************************
Процедура ВыбФайлНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "text (*.txt)|*.txt";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";

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

КонецПроцедуры
//*******************************************************************************
Процедура путьКФайлуЗагрузкиОткрытие(Элемент, СтандартнаяОбработка)

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

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

//*******************************************************************************

Процедура ЗаполнитьНажатие(Элемент)

Если Вопрос("Табличная часть будет очищена,продолжить?", РежимДиалогаВопрос.ДаНет)
= КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;

ОС.Очистить();

текст = Новый ТекстовыйДокумент;
Попытка
текст.Прочитать(путьКФайлуЗагрузки,КодировкаТекста.UTF8);
Исключение
Сообщить("Не удалось прочитать файл: "
+ ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;

квоСтрок = текст.КоличествоСтрок();
Если Не квоСтрок > 0 Тогда
Сообщить("Файл пустой",СтатусСообщения.Внимание);
Возврат;
КонецЕсли;

//получаем первую строку с форматом файла
Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
Стр = Текст.ПолучитьСтроку(НомерСтроки);


КонецЦикла;

КонецПроцедуры
//*******************************************************************************
Данные процедуры являются событиями табличной части товры

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

Процедура ТабличнаяЧастьПриАктивизацииСтроки(Элемент)
М = Новый Массив;
М.Добавить(ЭлементыФормы.Товары.ТекущаяСтрока);
М.Добавить(ПредСтрока);
ЭлементыФормы.Товары.ОбновитьСтроки(М);
ПредСтрока = ЭлементыФормы.Товары.ТекущаяСтрока;
КонецПроцедуры
//_______________________________________________________________________
Процедура ОбойтиУровеньДерева(Строки)

Для каждого Строка из Строки Цикл
Если Строка.СтатьяДС.Ссылка.ЭтоГруппа Тогда
Сообщить("Группа " +Строка.СтатьяДС.Ссылка);
Иначе
Сообщить("Элемент " +Строка.СтатьяДС.Ссылка);
КонецЕсли;
ОбойтиУровеньДерева(Строка.Строки);
КонецЦикла;

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

//_________________________________________________________________________
Запрос=Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
|СтатьиДвиженияДенежныхСредств.Ссылка КАК СтатьяДС,
|ЕСТЬNULL(GD_ПланОбороты.СуммаОборот, 0) КАК Сумма
|ИЗ
|Справочник.СтатьиДвиженияДенежныхСредств КАК СтатьиДвиженияДенежныхСредств
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.GD_План.Обороты(&ДатаНачала, &ДатаОкончания, Месяц, ) КАК GD_ПланОбороты
|ПО СтатьиДвиженияДенежныхСредств.Ссылка = GD_ПланОбороты.СтатьиДС.Ссылка
|
|УПОРЯДОЧИТЬ ПО
|СтатьяДС ИЕРАРХИЯ";

Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания",ДатаОкончания);

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

ОбойтиУровеньДерева(ТабличноеПоле.Строки)
Если НЕ Результат.Пустой() Тогда

Движения.ТоварыВРезервеНаСкладах.Записывать = Истина;
Движения.ТоварыВРезервеНаСкладах.Очистить();

Выборка=Результат.Выбрать();

Пока Выборка.Следующий() Цикл

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

КонецЕсли;
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц
Временные таблицы хранятся на сервере, данный объект упрощает написание сложных запросов.

Пример как можно выгрузить временную таблицу в таблицу значений:

Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Контрагенты ПОМЕСТИТЬ В ВКонтрагенты");
Запрос.Выполнить(); //Создалась таблица ВКонтрагенты
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВКонтрагенты");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы
ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений

Функция для просмотра ВТ в отладчике

Функция ЛукВТ(Запрос, ИмяВнутреннейТаблицы) Экспорт
Перем ЗапросТМП, Р;
//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ "+ИмяВнутреннейТаблицы);
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
Р=ЗапросТМП.Выполнить().Выгрузить();
Возврат Р;
КонецФункции

Если временных таблиц много и они висят в памяти не удаленные не очищенные возникает эффект постоянной загруженности сервера 1с предприятие как будто этот процесс выполняет все время какой то тяжелый запрос или обработку что сказывается на производительности системы в целом. Временную таблицу нужно удалять как можно скорее после использования.

Как удалить временную таблицу

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// (Менеджер ВТ создан, в нем уже есть временная таблица ИмяВременнойТаблицы)

ТекстЗапроса = "
| УНИЧТОЖИТЬ ИмяВременнойТаблицы
|";

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

Закрыть менеджер временных таблиц

Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ (идет описание запроса)
Результат = Запрос.Выполнить();
Запрос.МенеджерВременныхТаблиц.Закрыть();

Как использовать таблицу значений в запросе

ТЗ.ВыбратьСтроку(); это наша заполненная таблица

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ЗапросТЗ = Новый Запрос;
ЗапросТЗ.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
ЗапросТЗ.УстановитьПараметр("ТЗ" , ТЗ);


//сформируем поля таблицы значения, в качестве таблицы из которой будем выбирать
//узажим параметр нашей таблицы значений и поместим во внешнюю таблицу ИтоговаяТаблица

ЗапросТЗ.Текст = "ВЫБРАТЬ
| ТЗ.Контрагент КАК Контрагент,
| ТЗ.Договор КАК Договор,
| ТЗ.Период КАК Период,
| ТЗ.Валюта,
| ТЗ.Сумма,
| ТЗ.СуммаАгенту
|ПОМЕСТИТЬ ИтоговаяТаблица
|ИЗ
| &ТЗ КАК ТЗ";


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

//Далее описываем поля таблицы и указываем что выбирать будем из внешней таблицы
ЗапросТЗ.Текст=
"ВЫБРАТЬ
| ИтоговаяТаблица.Контрагент,
| ИтоговаяТаблица.Договор,
| ИтоговаяТаблица.Период,
| ИтоговаяТаблица.Валюта,
| ИтоговаяТаблица.СуммаАгенту,
| ИтоговаяТаблица.Сумма
|ИЗ
| ИтоговаяТаблица КАК ИтоговаяТаблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ib_ДоговорЗайма КАК ib_ДоговорЗайма
| ПО ИтоговаяТаблица.Контрагент = ib_ДоговорЗайма.Заимодавец";

Результат=ЗапросТЗ.Выполнить();

Если НЕ Результат.Пустой() Тогда
Выборка=Результат.Выбрать();


Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Контрагент);

КонецЦикла;

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

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

Движения.ОстаткиНоменклатуры.Записывать = Истина;


Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
|ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
|СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
|ПродажаТоваровТовары.Ссылка.Склад КАК Склад
|ПОМЕСТИТЬ ТабДок
|ИЗ
|Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
|ПродажаТоваровТовары.Ссылка = &Ссылка
|И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
|
|СГРУППИРОВАТЬ ПО
|ПродажаТоваровТовары.Номенклатура,
|ПродажаТоваровТовары.Ссылка.Склад
|
|ИНДЕКСИРОВАТЬ ПО
|Номенклатура,
|Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|ТабДок.Номенклатура КАК Номенклатура,
|ТабДок.Количество КАК Количество,
|ТабДок.Склад КАК Склад,
|ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
|ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
|ОстаткиНоменклатурыОстатки.Партия.Дата КАК ПартияДата,
|ОстаткиНоменклатурыОстатки.Партия
|ИЗ
|ТабДок КАК ТабДок
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
|&Момент,
|(Номенклатура, Склад) В
|(ВЫБРАТЬ
|ТабДок.Номенклатура,
|ТабДок.Склад
|ИЗ
|ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
|ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
|Номенклатура,
|ПартияДата
|ИТОГИ
|МАКСИМУМ(Количество),
|МАКСИМУМ(Склад),
|СУММА(КоличествоОстаток),
|СУММА(СуммаОстаток)
|ПО
|Номенклатура";


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

Запрос.УстановитьПараметр("Ссылка",Ссылка);

Результат=Запрос.Выполнить();

ВыборкаНоменклатуры=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатуры.Следующий() Цикл

Если ВыборкаНоменклатуры.КоличествоОстаток< ВыборкаНоменклатуры.Количество Тогда
Отказ=Истина;
Сообщение=Новый СообщениеПользователю;
Нехватка=ВыборкаНоменклатуры.Количество-ВыборкаНоменклатуры.КоличествоОстаток;
Сообщение.Текст="В документе №" +Номер+" от " +Дата+ "не хватает "+Нехватка+"единиц
товара"+ВыборкаНоменклатуры.Номенклатура;
Сообщение.Сообщить();

Иначе

КоличествоНадоСписать=ВыборкаНоменклатуры.Количество;
ВыборкаДетальныеЗаписи=ВыборкаНоменклатуры.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Если ВыборкаДетальныеЗаписи.КоличествоОстаток<= КоличествоНадоСписать Тогда

КоличествоКСписанию=ВыборкаДетальныеЗаписи.КоличествоОстаток;
СтоимостьКСписанию= ВыборкаДетальныеЗаписи.СуммаОстаток;
КоличествоНадоСписать=КоличествоНадоСписать-КоличествоКСписанию;

Иначе

КоличествоКСписанию=КоличествоНадоСписать;

Если ВыборкаДетальныеЗаписи.КоличествоОстаток<>0 Тогда
СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
Иначе
СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СуммаОстаток;
КонецЕсли;
//Обнуляем количество к списанию
КоличествоНадоСписать=0;

КонецЕсли;

Движение=Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Номенклатура= ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад=Склад;
Движение.Партия=ВыборкаДетальныеЗаписи.Партия;
Движение.Количество=КоличествоКСписанию;
Движение.Сумма=СтоимостьКСписанию;

//Проверяем необходимость дальнейшего перебора партий
Если КоличествоНадоСписать<=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;//По партиям

КонецЕсли;
КонецЦикла; //По товарам

Движения.Задолженности.Записывать = Истина;
Движение = Движения.Задолженности.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.СуммаДолга = СуммаДокумента;

Движения.БронированиеТовара.Записывать=Истина;
Встречаются ситуации, когда часто используемый пункт меню запрятан довольно "глубоко", или нужная кнопка не помещается на экран, а у важного действия отсутствует комбинация "горячих" клавиш.

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

Неужели под каждого пользователя базы (а их может быть не один десяток) придется подстраивать текущий или создавать новый интерфейс в конфигураторе? Нет! Благодаря возможностям по тонкой настройке интерфейса у платформы 8.1 нет необходимости ни вызывать квалифицированного специалиста, ни лезть в конфигуратор*.

Примечание:
* Если быть до конца точным, могут возникнуть предпосылки по созданию индивидуального интерфейса для пользователя в режиме конфигуратора, но эти вопросы лежат за рамками данной статьи.

Решаются задачи по индивидуальной настройке довольно элегантно - при помощи персональных панелей инструментов. Для примера будем использовать бухгалтерский интерфейс типовой конфигурации "Бухгалтерия предприятия" (ред. 1.6) с демонстрационными данными.

Но прежде, чем перейти к описанию механизма индивидуальной настройки интерфейса, обозначим некие общие возможности, которые платформа 8.1 предоставляет своим пользователям. В частности, нельзя увидеть сразу все стандартные пункты меню и все панели инструментов, которые по умолчанию встроены в платформу (независимо от конфигурации). И это не ошибка. Дело в том, что некоторые возможности являются контекстно-зависимыми, а потому они доступны только тогда, когда в них есть смысл.

Достать их просто - на любом пустом месте рядом с доступными панелями инструментов достаточно нажать правую кнопку мыши. В открывшемся списке вы сразу увидите все доступные панели, причем включенные (видимые) будут помечены галочками.
Начав в 2003 г. активное продвижение следующего поколения решений "1С:Предприятие" 8 на относительно новом для себя рынке корпоративных клиентов, фирма "1С" (http://www.1c.ru) оказалась, на наш взгляд, в необычном для себя положении. До того компания традиционно выступала технологическим "локомотивом" для своих потребителей из сектора малого бизнеса: ее разработчики постоянно опережали (но не намного, чтобы не оторваться) текущие потребности клиентов. На среднем рынке ситуация иная — у заказчиков уже давно сформировались в целом высокие требования к ИТ, а к появлению новых поставщиков здесь относятся достаточно настороженно.

Поэтому, несмотря на очевидный успех деятельности "1С" в этом направлении за последние три года, ситуация пока больше напоминает некий «испытательный срок», в течение которого фирма должна показать не только возможность применения своего ПО в реальных условиях у корпоративных пользователей, но и готовность к динамичному развитию технологий для обеспечения растущих потребностей клиентов. Таким образом, новизна момента (точнее, последних трех лет) для "1С" заключается еще и в том, что если раньше ее разработчики могли во многом полагаться на собственные представления о направлениях развития своего ПО, то теперь им приходится действовать в более жестких рамках "технического задания" от рынка. Причем необходимо еще и обеспечить "непрерывность" своего бизнеса (имея в виду и сугубо технологические аспекты).

Если же говорить о технологических проблемах развития экономического ПО "1С", то, безусловно, одна из главных задач (хотя, конечно, далеко не единственная) — это повышение производительности и масштабируемости (ПиМ) ее прикладных решений. О том, что "1С" признает важность этих вопросов, говорит хотя бы тот факт, что сама фирма после выпуска четыре года назад платформы "1С:Предприятие" 8.0 начала регулярно официально знакомить ИТ-общественность с результатами тестирования в этой области. Показательно и то, что первое существенное технологическое обновление платформы "1С:Предприятие" 8, выпуск новой версии 8.1, было связано в значительной степени именно с решением задач масштабирования и производительности (см. статью "Платформа "1С:Предприятие 8.1" уже на подходе, «BYTE/Россия» № 9’2006).

Обсуждение хотелось бы начать с рисунка, который в целом иллюстрирует рост производительности платформы "1С:Предприятие", начиная с версии 7.x (рис. 1). Но прежде нужно сделать два существенных замечания.

1. На графике приведены значения АРПмакс: это не просто число работающих пользователей, а максимальное число активно работающих пользователей (подробнее об этом речь пойдет ниже).

2. Все оценки предельных показателей производительности "1С:Предприятие" разных версий — это личные оценки автора (а не фирмы «1С»), полученные путем обобщения имеющихся у него сведений. Анализ более обширного фактического материала может дать несколько иные результаты. Однако задача этой работы состояла не в том, чтобы определить абсолютные показатели сами по себе, а в том, чтобы проанализировать общую логику развития возможностей производительности и масштабирования платформы "1С:Предприятие".