1с 8 Почему в СКД во вложенном запросе не видно параметров связи в настройке схемы

Нечасто делаю отчеты на СКД, тем более с использованием вложенных схем. И порой очень раздражает когда делаешь вложенную схему, видишь, что в другом подобном отчете всё есть, а в моем нету полей связи родительского отчета со вложенным.

Нет полей вложенного запроса для связи

Попробуем разобраться. И оставляю себе напоминалочку, так как нервы не железные.

1 Заходим в схему вложенного отчета

рис. Открываем схему вложенного отчета

2 Открываем конструктор запроса

3 Переходим на закладку «Компоновка данных» и переносим стрелками из левой в правую часть те реквизиты, по которым хотим установить связь.

Жмем Ок.

4 Открываем снова настройки связей схемы

Нужные поля для связи появились

5 Но вот в правом значении дает выбирать только элементы

6 Поэтому нажимаем крестик

7 Выбираем «Поле компоновки данных

8 Выбираем нужное поле родителя для связи с вложенным запросом

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

1С 8 Как заполнить значения при добавлении новой строки в табличную часть

Нужно вставить обработчик события самой табличной части, который называется «При начале редактирования». В нем есть параметр «Новая строка», что дает нам возможность выполнять некоторые действия только при добавлении новой строки. При этом сама строка уже существует, 

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

в отличии от обработчика «ПередНачаломДобавления», который можно использовать с тем же успехом, но код будет другой

Примерно так:

СтандартнаяОбработка = ложь;

нов = Состав.Добавить();

нов.ИсточникДанных = перечисления.СпособПолучения.ИзТабличнойЧасти;

То бишь, сами добавляем строку и устанавливаем параметры, что мне меньше нравится. Я приверженец использования типовых механизмов насколько это возможно.

1C 8 как округлять до заданной числом точности, например 0.01

мОкруглятьДо = 0,01;

Цел(ВыборкаСотрудник.Сумма/мОкруглятьДо)*мОкруглятьДо;//округляет до сотых

мОкруглятьДо = 0,1;

Цел(ВыборкаСотрудник.Сумма/мОкруглятьДо)*мОкруглятьДо;//округляет до десятых

1С 8 неверные конечные остатки в универсальном отчете

Три основных причины неверного конечного остатка в универсальном отчете. Те же причины могут приводить к неверным конечным остаткам и в обычных отчетах, а т.д. СКД.

1 Следует указывать в полях выборки «ПериодСекунда», если в них присутствует регистратор.

2 Немного каламбурно, поэтому смотрите на примеры. Если вы выбираете разименованное значение реквизита объекта, например: ВЫБРАТЬ ТоварыВНТТОстаткиИОбороты.Склад.ВидСклада

тогда нужно выбирать и сам объект отдельным полем, например:

ВЫБРАТЬ 

ТоварыВНТТОстаткиИОбороты.Склад ,

ТоварыВНТТОстаткиИОбороты.Склад.ВидСклада

3 Если вы используете периодичность в запросе, отличную от «Авто», тогда нужно в полях выборки указывать все поля периода: ПериодСекунда,
ПериодМинута,
ПериодДень,
ПериодНеделя,
ПериодМесяц,
ПериодГод

Лучше один раз увидеть, поэтому просмотрите мой коротенький мастер-класс по этой теме на YouTube

Как работает доступ на уровне записей RLS в 1с 8.3

С помощью RLS можно скрыть некоторые записи от пользователей, которые не должны их видеть.

Такую настройку можно привязать чисто к роли, или же создать справочник, в котором будет информация о том, какой пользователь к чему имеет доступ. Типичный пример — никто кроме расчетчика и кадровика не должен видеть РКО с видом операции «Выплата зарплаты». Делаем справочник, к примеру «Группы доступа РКО», а в его табличной части добавляем два реквизита: 1) пользователь, 2) Вид операции РКО. И к примеру далее отталкиваемся от того, что если есть комбинация Пользователь/Вид операции РКО — тогда пользователю можно видеть РКО с таким видом операций.

Касательно ролей, есть один интересный вопрос: Что если в одной роли есть ограничение доступа на уровне записей, а в другой нет? Будет ли ограничение потому что в одной из ролей оно есть, или не будет, потому что в другой роли его нет? В этом случае 1С будет работать привычным для программиста образом — Если хотя бы в одной роли что то разрешено, то разрешение преобладает над запретом. Иными словами в описанном случае ограничение доступа не будет действовать, будут видны все записи.

Поэтому обычно используют две роли: «Пользователь», и «Наша Роль» — в которой мы и творим ограничение на уровне записей, далее (ОУЗ
 (RLS) ).

Можно поступить хитрее. Для всех ролей внести ОУЗ
 (RLS) , а для отдельной роли нет. И у кого будет эта роль — тот будет видеть все записи.

Роли, у которых нет прав на данный объект, не влияют на ОУЗ (RLS) . Поэтому вносить правило можно только в роли, у которых имеется доступ к объекту, который мы хотим ограничить.

ОУЗ используется только для действий «Чтение»,»Изменение»,»Добавление» и «Удаление». Причем для каждого действия правила могут быть различными. Это дает большую гибкость.

По сути ОУЗ  (RLS) — это запрос, со своими конечно ограничениями. Видны будут те записи, которые войдут в этот запрос. При этом в запросе нет полей, только таблицы. По умолчанию это текущая таблица (справочник или документ и т.д), в которой мы настраиваем ОУЗ (RLS) . Можно использовать произвольные таблицы.

Таким образом запрос вида «ГДЕ ЛОЖЬ» сделает то, ни одной записи мы не увидим. А «ГДЕ ИСТИНА» — покажет все записи. Что касается нашего РКО, то чтобы не увидели зарплатные документы, запрос будет выглядеть так 

ГДЕ
ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыРаботнику)
И
ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыПоВедомостям)

То же самое будет, если обратиться напрямую к таблице

ТекущаяТаблица ИЗ Документ.РасходныйКассовыйОрдер КАК ТекущаяТаблица ГДЕ
ТекущаяТаблица.ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыРаботнику)
И
ТекущаяТаблица.ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыПоВедомостям)

Есть специальные зарезервированные фразы, которые начинаются с символа #. Так можно обратиться к текущей таблице с помощью выражения #ТекущаяТаблица. Зачем это нужно, для универсальности наверно. Использовать псевдонимы можно и нужно, если у вас используется несколько таблиц, у которых есть одинаковые реквизиты. В предыдущем запросе вы увидели, как мы создали псевдоним «ТекущаяТаблица» для таблицы «Документ.РасходныйкассовыйОрдер». А можно то же самое сделать вот так.

	ТекущаяТаблица
ИЗ
	#ТекущаяТаблица КАК ТекущаяТаблица
 ГДЕ
ТекущаяТаблица.ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыРаботнику)
И
ТекущаяТаблица.ВидОперации<>Значение(Перечисление.ВидыОперацийРКО.ВыплатаЗаработнойПлатыПоВедомостям)

Если такой запрос с выражением «#ТекущаяТаблица» использовать в разных объектах, то каждый раз будет иметься ввиду именно таблица этого объекта. То-есть — это относительная ссылка на таблицу конкретного документа, справочника, регистра, в котором используется данное выражение.

Как вы заметили — в запросах ОУЗ нет слова ВЫБРАТЬ и так же нет полей. Зачем последние два запроса начинаются со слова «ТекущаяТаблица» — если это псевдоним таблицы, сказать не могу. Просто все так делают.

Покажу ещё пример, как сделал настраиваемые ограничения, с помощью нового справочника. Здесь присутствует объединения. Пользователь не видит продажи отчетах по регистру «Продажи», у которых ему не имеется соответствующей строки «пользователь/склад» в этом справочнике.

ТекущаяТаблица ИЗ РегистрНакопления.Продажи КАК ТекущаяТаблица
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступаСкладов.Склады КАК ГруппыДоступаСклады
    ПО 
        (    ТекущаяТаблица.Подразделение = ГруппыДоступаСклады.Склад.Подразделение
        	)
        И (ГруппыДоступаСклады.Ссылка.Пользователь = &ТекущийПользователь))

Здесь мы увидели новый элемент — такой как &ТекущийПользователь. Это параметр. Параметры берутся из одноименных переменных сеанса. По другому установить параметры для отбора невозможно.

Как видите, пользователь будет видеть только те записи, в которых склад соответствует строчке из табличной части справочника в которой указаны склады, к записям с которымы пользователь имеет возможность видеть. И в шапке справочника указан сам пользователь. Какой справочник придумать — это зависит от вашей фантазии. У меня он выглядит так:

Куда вводятся правила ОУЗ (RLS) в 1С 8. Есть много способов записать эти правила. Можно их писать непосредственно в документе, в роли, в окне «Все роли», в окне «Ограничения доступа». Выбираете роль, объект, и действие (чтение, запись, изменение или удаление) — и в поле редактирования нужно написать правило.

В окне редактирования одной роли, или в окне редактирования «Все ограничения доступа» имеется закладка «Шаблоны ограничений«, в котором можно написать шаблон, а потом вместо того, чтобы каждый раз копировать весь запрос, вносить только имя шаблона в формате #ИмяШаблона. Это предпочтительный метод, так как при изменении запроса не нужно искать и переклацывать его повсюду.

Каждая отдельно взятая роль «видит» только свои шаблоны. Так что для использования того же запроса в другой роли, нужно в ней создать аналогичный шаблон.

Изменили шаблон, и всё. Вот для примера на картинке мы создали шаблон.

А вот мы им воспользовались.

или так, в окне «Все роли»

Или так, в окне «Все ограничения доступа».

Кто не знает, это в окне метаданных нужно открыть «Общие» ->»Роли» и щелкнуть по пункту «Роли» правой кнопкой мыши, и выбрать нужный пункт.

Кстати в окне «Все ограничения доступа» есть удобный конструктор запроса. А вот в шаблонах почему то конструктора нет. Поэтому для удобства первоначально можно создать запрос в этом конструкторе, а затем скопировать в шаблон и там уже корректировать при необходимости.

Для этого откройте для редактирования нужную строчку ограничений, и выберите кнопку конструктора.

Недостаточно памяти сервера для обработки команды 1С файловая при подключении через общую папку по сети

Эта ошибка возникает не только при подключении через 1С, но и просто при попытке открыть файл через сетевой ресурс.  Обычно это бывает, если ваш компьютер на XP, а сервер — виндовс семерка, либо наоборот, но не обязательно. Просто чаще бывает именно так.

Нужно зайти на компьютер-сервер —

Тобишь на тот компьютер, на котором файловая база 1с располагается, он и есть сервер в данном случае.

В нем зайти в реестр,  то есть нажать сочетание клавиш windows + R, либо зайти «Пуск» и внизу в окне ввода набрать «cmd» и нажать «Enter», он же «Ввод», он же стрелка вниз и влево (перевод каретки).

В реестре перейти в раздел: 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters

найти там параметр под названием: 

IRPStackSize

Если его нет — создать: Щелкнуть правой кнопкой мыши на свободном месте правой панели, и выбрать пункт «Создать — Параметр DWORD (32 бита)

Ввести наименование
IRPStackSize  в новой добавившейся строчке или же скопировать отсюда.

Важно — соблюдайте регистр букв. То есть большие и маленькие буквы как здесь указано, так и должны быть в наименовании в реестре.

Нажмите Enter

Нажмите ещё раз Enter или кликните двойным щелчком левой кнопки мыши по имени параметра 
IRPStackSize

или кликните правой кнопкой мыши по этой строке и выберите пункт «Изменить»

В появившемся окне выберите систему исчисления «Десятичная«, а значение напишите 50. По имеющейся у меня информации с других сайтов — это максимальное число одновременных подключений. Причем 1с 8 делает сразу несколько подключений — от 10 и больше. По проверенной мной информации, обычно это 24 открытых файла.

Нажмите ОК.

Закройте окно реестра.

Перезагрузите компьютер.

Ещё раз повторяю, так как многие, и я в том числе на этом спотыкались — это всё нужно делать на компьютере — на котором располагается папка общего доступа с базой 1С.

То же самое касается любых файлов, при доступе к которым не из 1с возникают подобные ошибки.

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

Нужно установить следующие параметры в реестре:

 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\size
Установите одно из значений ключа: 1, 2 или 3. 1 = Минимальное использование памяти 2 = Сбалансированное 3 = Максимальная пропускная способность для общих файлов и приложений, подключающихся по сети
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\LargeSystemCache
Для ключа доступны значения 0 и 1. 1 = Максимальная пропускная способность для использования файлов по сети, 0 = Максимальная пропускная способность для приложений, работающих по сети.

Таким образом, чтобы пользователи могли использовать общие файлы и подключаться к базе данных 1С без ограничений, выставляем на компьютере, который хотим использовать в качестве файлового сервера такие значения:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"LargeSystemCache"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]
"Size"=dword:00000003

Собственно у меня после такой настройки достаточно крупная контора уже несколько лет работает на файловой 1с8 с кучей пользователей. Хотелось бы сервер конечно для удобства регламентных заданий, но вот так.. настроил, людям хватает.

УПП 1.3 Украины документ Принятие к учету ОС не делает бухгалтерских проводок

В УПП 1.2 и 1.3 это так. В других конфигурациях не пробовал вести ОС, не знаю. Если документ «Принятие к учету ОС» не сделал ожидаемых бух проводок, то скорее всего и в поступлении товаров услуг не провелись некоторые регистры, например, «Партии товаров на складах (упр. учет)». Это связано с настройкой учетной политики. Перейдите в «Сервис -> Настройка Учета  -> Настройка параметров учета  -> Режим учета затрат, и установате переключатель «Использовать партионный учет», а так же обязательно установате флажки «В управленческом учете», «В регламентированном учете». Это дает большую нагрузку на систему при проведении документов, чем без установленных флажков. Иначе проводки по партиям делаются какой то обработкой, в конце учетного периода, не помню как она называется, врать не буду, смотреть лень. Если кто знает напишите в комментариях.

Более наглядно процесс настройки показан на картинке.

Фишечки универсального отчета 1с8 типовые конфигурации

В отличии от СКД — универсальный отчет написан на прикладном уровне и доступен только в типовых конфигурациях. Он использует механизмы типовых конфигураций, чтобы, например, локализовать отчет, то есть автоматически переводить его на нужный язык.

Главные вопросы, сложности — это:

  1. не выводится итоговая строка (колонка). Нужно убрать в отчете поля построителя во всех вложенных запросах, и оставить только поля построителя в самом верхнем запросе. Иначе они просто могут произвольно не попадать в отчет.
Рис. 1. В запросе универсального отчета не должно быть полей построителя во вложенных запросах.

При этом в запросе верхнего уровня наоборот — все поля должны быть указаны в полях построителя, иначе универсальный отчет просто напросто не увидит их при начальной настройке.

У меня была ситуация, когда в консоли или СКД нормально выводились итоги по ценам(среднее), суммам и т.д., зато в универсальном отчете это были пустые колонки. Или, например, если в показателях не устанавливался флажок напротив Количество Приход, то были пустыми все колонки, которые в запросе умножались на это количество. Проблема всегда была в том, что во вложенных запросах указаны поля построителя. После их убирания отчет выводился ожидаемо, согласно запроса.

2.Как сделать, чтобы универсальный отчет переводил наименования колонок с русского на ваш национальный язык, например, украинский. Вернее для украинских конфигураций это будет только украинский, для польских — польский и т.д. Откройте регистр сведений «Переводы текстов», добавьте новую строку, и укажите в колонке «текст (на ru)» русский вариант колонки добуквенно (до знака), учитывая регистр, а в колонке «текст (на uk)» украинский вариант. Если у вас выбрана настройка «Язык печатных форм» украинский, отчеты тут же переведутся согласно указанного варианта перевода.

Рис. 2 Переводы текстов (локализация отчетов в 1С)

Поля хеша и УИД естественно заполняются системой автоматически. Вероятно нужны для однозначной идентификации.

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

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

Рис. 3. Модули локализации

Заметьте, что такие часто используемые фразы как «Начальный остаток», «Приход»,»Расход», «Оборот»,»Конечный остаток» и т. д., а так же большинство используемых в отчетах наименований колонок уже забиты в этот регистр и вводить их повторно нет смысла. 

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

Фишечки получения цены 1С8 в типовых конфигурациях

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

не все параметры являются обязательными. Только номенклатура, типЦен.

Чтобы сразу в документе расчитать и получить плановую себестоимость

цена =РассчитатьПлановуюСебестоимостьВСтрокеТабЧастиПроизводство(СтрокаТабличнойЧасти, ДокументОбъект, ВалютаРегламентированногоУчета, ПересчитатьНалоги, ЗаполнитьСебестоимостьУпр, ВалютаУправленческогоУчета = Неопределено) ; 

Тип цен плановой себестоимости

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