На работе активно использую ТабличноПоле из 1С++. Всегда вызывает заморочки, когда в основе поля лежит сложный запрос со множеством условий. В основном приходилось делать в качестве поставщика таблицу значений. Нигде не встречал подталкивания к простейшей мысли - использовать временную таблицу. Как-то у меня в голове сидело, что временная таблица работает в рамках одного запроса. Инерция мышления.
И вот когда в очередной раз возникла задача со сложным запросом, вдруг решил проверить - а как поведет себя временная таблица? А она хорошо себя повела. Выбрал предварительно данные во временную таблицу, а потом в табличном поле можно уже вертеть, как угодно и накладывать дополнительные фильтры. Все просто летает. И не нужны лишние заморочки с таблицей значений.
Это я просто делюсь опытом.
Табличные переменные (declare @tab table(...)) живут в рамках запроса.
Временные таблицы #tab живут до конца создавшего сеанса или до явного удаления.
Временные таблицы ##tab живут до конца всех сеансов или до явного удаления.
Временные таблицы, ставшие ненужными, особенно если они большие, желательно удалять. И тут главное уловить момент когда это сделать.
Просто делюсь
Цитата: trad от 11 марта 2024, 09:30Табличные переменные (declare @tab table(...)) живут в рамках запроса.
Временные таблицы #tab живут до конца создавшего сеанса или до явного удаления.
Временные таблицы ##tab живут до конца всех сеансов или до явного удаления.
Временные таблицы, ставшие ненужными, особенно если они большие, желательно удалять. И тут главное уловить момент когда это сделать.
Просто делюсь
Может подскажешь один момент.
У нас перед всеми запросами со временными таблицами добавляется такой код:
IF EXISTS(SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'[tempdb].[dbo].[#<ИмяВременнойТаблицы>]')) DROP TABLE #<ИмяВременнойТаблицы>
Код этот был еще со времен Rainbow. Но он как-то странно работает. Вроде таблица очищается, но вот если меняется структура временной таблицы (добавляем колонку), то стабильно получаем "invalid column name". Приходится перезапускать 1C.
В чем дело?
Цитата: trad от 11 марта 2024, 09:30до конца создавшего сеанса
а что такое "сеанс" и когда он "кончается"..?
В случае семерки, один клиентский процесс 1cv7s.exe - это одно подключение/сеанс
(ну если конечно других подключений из этого процесса не сделано через ADO/1c++)
Ну, вот когда клиентский процесс кончается тогда и подключение/сеанс тоже.
зы
Прямые запросы 1c++ по умолчанию используют нативное подключение клиентского процесса 1cv7s.exe
Цитата: АЛьФ от 11 марта 2024, 09:52Вроде таблица очищается, но вот
этим кодом таблица должна удаляться, а не очищаться
А по существу, проверь чему равно ИмяВременнойТаблицы. Возможно там уже есть #
В итоге получается ##Хотя нет, не похоже на это, таблица же вроде удаляется. Тогда у меня нет ответа
Я создаю временные таблицы так:
|set nocount on
|if exists (select * from tempdb..sysobjects where id = object_id('tempdb..%Имя%') and sysstat & 0xf = 3)
| drop table %Имя%;
|create table %Имя% ...
, где %Имя% это #имяВТ или ##имяВТ
Какие-то значит наши внутренние заморочки в настройках.
Сегодня 8-ку вспомнил, решил попробовать:
ТекстЗапроса = "
|-- рабочие запросы
|SELECT TOP 4
| спрФирмы.ID, спрФирмы.DESCR
|INTO #ТаблицаФирм3
|FROM $Справочник.Фирмы as спрФирмы (NOLOCK)
|WHERE спрФирмы.ISMARK = 0
|
|; -- можно и GO использовать, результат будет тем же..
|
|-- Drop table #ТаблицаФирм3
|SELECT top 50
| *
|FROM $Регистр.ПартииТоваров as спрПартии(NOLOCK)
|WHERE $спрПартии.Фирма IN (SELECT ID FROM #ТаблицаФирм3)
|";
запрос рабочий, только надо после его отработки уничтожать таблицу.
пикча https://disk.yandex.ru/i/3-EmXEfapU-UMA
Вообще ничего не понял.
При чем здесь 8?
.
В чем суть? Чем я, неискушенный в прямых запросах, должен проникнуться?
Цитата: Злоп от 19 марта 2024, 23:31В чем суть?
Просто я открыл для себя связку Select ... Into в прямых запросах и пакетные запросы в 1С++ :) спустя 10 лет :)
ну бывает, чё... :)
используя пакетные запросы нужно не забывать про set nocount on
Цитата: trdm от 19 марта 2024, 20:34запрос рабочий, только надо после его отработки уничтожать таблицу.
конкретно в этом случае можно использовать табличную переменную. Тогда и дропать не нужно
|set nocount on
|declare @ТаблицаФирм3 table(ID char(9), DESCR varchar(100), primary key(id))
|
|insert into @ТаблицаФирм3
|SELECT TOP 4
| спрФирмы.ID, спрФирмы.DESCR
|FROM $Справочник.Фирмы as спрФирмы (NOLOCK)
|WHERE спрФирмы.ISMARK = 0
|
|SELECT top 50
| *
|FROM $Регистр.ПартииТоваров as спрПартии(NOLOCK)
|WHERE $спрПартии.Фирма IN (SELECT ID FROM @ТаблицаФирм3)
Цитата: trad от 20 марта 2024, 11:21Цитата: trdm от 19 марта 2024, 20:34запрос рабочий, только надо после его отработки уничтожать таблицу.
конкретно в этом случае можно использовать табличную переменную. Тогда и дропать не нужно
Тогда возникает другая проблема - полное описание таблицы. Зачастую временные таблицы используются с разным набором колонок. И прописывать их каждый раз явно - мрак.
Цитата: АЛьФ от 20 марта 2024, 11:24Тогда возникает другая проблема - полное описание таблицы. Зачастую временные таблицы используются с разным набором колонок. И прописывать их каждый раз явно - мрак.
Вот именно. Так что SELECT ... INTO #ИмяТаблицы гораздо изящнее.
Только добавить вверху запроса конструкции IF EXIST .. Drop TABLE
А еще лучше модернизировать ODBCRecordset для уничтожения таблиц после запроса.
В принципе можно и унаследоваться и обабатывать "После"ВыполнитьИнструкцию() и т.п.
Цитата: trdm от 20 марта 2024, 11:45А еще лучше модернизировать ODBCRecordset для уничтожения таблиц после запроса.
Вот как раз заглавный пост этой теме и показывает, что хорошо, когда этого не происходит :)
Ну дык временем жизни временных таблиц управляешь сам.
Любопытно. есть глюк с SELECT INTO
SELECT
Поле as ПолеСКирилицей
,Поле as fldLat
INTO
#timeTable
;
Select
From obj
Where
obj.fld in (Select ПолеСКирилицей from #timeTable) -- не работает.
obj.fld in (Select fldLat from #timeTable) -- работает.
collation_name текущей БД и tempdb совпадают?
Cyrillic_General_CI_AS - тестовая
Cyrillic_General_CI_AS - tempdb
Цитата: trdm от 01 апреля 2024, 10:54Любопытно. есть глюк с SELECT INTO
SELECT
Поле as ПолеСКирилицей
,Поле as fldLat
INTO
#timeTable
;
Select
From obj
Where
obj.fld in (Select ПолеСКирилицей from #timeTable) -- не работает.
obj.fld in (Select fldLat from #timeTable) -- работает.
А че значит не работает ?
Ну выведи чего там obj.fld в селекте и сравни.
Не понимаю, чего там может не работать?
SELECT
'тут явно одна из черепашек врёт' as Хрень
,'Вася' as fld
INTO
#obj
;
SELECT
'Вася' as ПолеСКирилицей
,'loshped' as fldLat
INTO
#timeTable
;
Select *
From #obj
Where fld in (Select ПолеСКирилицей from #timeTable) -- усё работает работает.
--obj.fld in (Select fldLat from #timeTable) -- работает.
в оригинеле так:
ТекстЗапроса = "
|-- Чистка временной таблицы
|set nocount on
|if exists (select * from tempdb..sysobjects where id = object_id('tempdb..#ВосстановленныеТовары') and sysstat & 0xf = 3)
| drop table #ВосстановленныеТовары;
|
|-- ловим документы передачи товара реализатору
|SELECT
| $регПартииТов.Фирма as [Фирма $Справочник.Фирмы]
| , $регПартииТов.Товар as [Товар $Справочник.Номенклатура]
| ,$регПартииТов.ПрихДокумент as [Документ $Документ] -- не пашет :(
| ,$регПартииТов.ПрихДокумент as docum_pr
| , -$дсОтчетР.Количество as Количество
| , -$дсОтчетР.Сумма as Сумма
| , CAST(LEFT(жОбщий.Date_Time_IDDoc, 8) as DateTime) as Дата
| INTO #ВосстановленныеТовары
|FROM
| $Регистр.ПартииТоваров as регПартииТов(NOLOCK)
| LEFT JOIN $ДокументСтроки.ОтчетРеализатора as дсОтчетР(NOLOCK)
| ON дсОтчетР.IDDOC = :ВыбОтчетРеализатора And $дсОтчетР.Товар = $регПартииТов.Товар
| AND $дсОтчетР.Количество <0
| LEFT JOIN _1SJourn as жОбщий (NOLOCK) on жОбщий.IDDOC = RIGHT($регПартииТов.ПрихДокумент,9)
|WHERE
| регПартииТов.IDDOC = :ВыбОтчетРеализатора
| AND регПартииТов.DEBKRED = 0
|ORDER BY жОбщий.DATE_TIME_IDDOC
|
|;
|
|SELECT
| $регВзаимПок.Фирма as [Фирма $Справочник.Фирмы]
| ,регВзаимПок.DEBKRED as ПриходРасход
| ,регВзаимПок.ACTNO as ACTNO
| , $регВзаимПок.Клиент as [Клиент $Справочник]
| , $регВзаимПок.Договор as [Договор $Справочник.Договора]
| , $регВзаимПок.СтавкаНДС as [СтавкаНДС $Перечисление.ЗначенияНДС]
| , $регВзаимПок.СтавкаНП as [СтавкаНП $Справочник.СтавкиНП]
| , $регВзаимПок.ПоставщикКомм as [ПоставщикКомм $Справочник.Контрагенты]
| , $регВзаимПок.ДоговорКомм as [ДоговорКомм $Справочник.Договора]
| , $регВзаимПок.ВидОтгрузки as ВидОтгрузки
| , $регВзаимПок.КредДокумент as [КредДокумент $Документ]
|
| , $регВзаимПок.Долг as Долг
| , $регВзаимПок.НеоплачСтоимость as НеоплачСтоимость
|
| , $регВзаимПок.ОблагаемаяБазаНП as ОблагаемаяБазаНП
| , $регВзаимПок.КодОперации as КодОперации
| , $регВзаимПок.Комитент as [Комитент $Справочник.Контрагенты]
| , $регВзаимПок.ДоговорКомитента as [ДоговорКомитента $Справочник.Договора]
| , $регВзаимПок.ДокПередачи as [ДокПередачи $Документ]
| , $регВзаимПок.ВзаимозачетС as [ВзаимозачетС $Справочник]
| , жОбщий.IDDOC as [Докум $Документ]
| , жОбщий.IDDOCDEF as Докум_вид
|FROM
| $Регистр.ВзаиморасчетыПокупателей as регВзаимПок(NOLOCK)
| INNER JOIN _1SJourn as жОбщий (NOLOCK) on регВзаимПок.IDDOC = жОбщий.IDDOC
|WHERE
| жОбщий.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
| AND $регВзаимПок.Клиент = $ВидСправочника36.Контрагенты+:ВыбКлиент
| AND ($регВзаимПок.КредДокумент IN (SELECT docum_pr FROM #ВосстановленныеТовары) OR
| $регВзаимПок.ДокПередачи IN (SELECT docum_pr FROM #ВосстановленныеТовары))
|ORDER BY
| жОбщий.DATE_TIME_IDDOC Desc
|";
Цитата: trdm от 07 апреля 2024, 15:14в оригинеле так:
ТекстЗапроса = "
|-- Чистка временной таблицы
|set nocount on
|if exists (select * from tempdb..sysobjects where id = object_id('tempdb..#ВосстановленныеТовары') and sysstat & 0xf = 3)
| drop table #ВосстановленныеТовары;
|
|-- ловим документы передачи товара реализатору
|SELECT
| $регПартииТов.Фирма as [Фирма $Справочник.Фирмы]
| , $регПартииТов.Товар as [Товар $Справочник.Номенклатура]
| ,$регПартииТов.ПрихДокумент as [Документ $Документ] -- не пашет :(
| ,$регПартииТов.ПрихДокумент as docum_pr
| , -$дсОтчетР.Количество as Количество
| , -$дсОтчетР.Сумма as Сумма
| , CAST(LEFT(жОбщий.Date_Time_IDDoc, 8) as DateTime) as Дата
| INTO #ВосстановленныеТовары
|FROM
| $Регистр.ПартииТоваров as регПартииТов(NOLOCK)
| LEFT JOIN $ДокументСтроки.ОтчетРеализатора as дсОтчетР(NOLOCK)
| ON дсОтчетР.IDDOC = :ВыбОтчетРеализатора And $дсОтчетР.Товар = $регПартииТов.Товар
| AND $дсОтчетР.Количество <0
| LEFT JOIN _1SJourn as жОбщий (NOLOCK) on жОбщий.IDDOC = RIGHT($регПартииТов.ПрихДокумент,9)
|WHERE
| регПартииТов.IDDOC = :ВыбОтчетРеализатора
| AND регПартииТов.DEBKRED = 0
|ORDER BY жОбщий.DATE_TIME_IDDOC
|
|;
|
|SELECT
| $регВзаимПок.Фирма as [Фирма $Справочник.Фирмы]
| ,регВзаимПок.DEBKRED as ПриходРасход
| ,регВзаимПок.ACTNO as ACTNO
| , $регВзаимПок.Клиент as [Клиент $Справочник]
| , $регВзаимПок.Договор as [Договор $Справочник.Договора]
| , $регВзаимПок.СтавкаНДС as [СтавкаНДС $Перечисление.ЗначенияНДС]
| , $регВзаимПок.СтавкаНП as [СтавкаНП $Справочник.СтавкиНП]
| , $регВзаимПок.ПоставщикКомм as [ПоставщикКомм $Справочник.Контрагенты]
| , $регВзаимПок.ДоговорКомм as [ДоговорКомм $Справочник.Договора]
| , $регВзаимПок.ВидОтгрузки as ВидОтгрузки
| , $регВзаимПок.КредДокумент as [КредДокумент $Документ]
|
| , $регВзаимПок.Долг as Долг
| , $регВзаимПок.НеоплачСтоимость as НеоплачСтоимость
|
| , $регВзаимПок.ОблагаемаяБазаНП as ОблагаемаяБазаНП
| , $регВзаимПок.КодОперации as КодОперации
| , $регВзаимПок.Комитент as [Комитент $Справочник.Контрагенты]
| , $регВзаимПок.ДоговорКомитента as [ДоговорКомитента $Справочник.Договора]
| , $регВзаимПок.ДокПередачи as [ДокПередачи $Документ]
| , $регВзаимПок.ВзаимозачетС as [ВзаимозачетС $Справочник]
| , жОбщий.IDDOC as [Докум $Документ]
| , жОбщий.IDDOCDEF as Докум_вид
|FROM
| $Регистр.ВзаиморасчетыПокупателей as регВзаимПок(NOLOCK)
| INNER JOIN _1SJourn as жОбщий (NOLOCK) on регВзаимПок.IDDOC = жОбщий.IDDOC
|WHERE
| жОбщий.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
| AND $регВзаимПок.Клиент = $ВидСправочника36.Контрагенты+:ВыбКлиент
| AND ($регВзаимПок.КредДокумент IN (SELECT docum_pr FROM #ВосстановленныеТовары) OR
| $регВзаимПок.ДокПередачи IN (SELECT docum_pr FROM #ВосстановленныеТовары))
|ORDER BY
| жОбщий.DATE_TIME_IDDOC Desc
|";
Ёпта... линейкой бы металлической за такой код (забыл добавить, по пальчикам! )
НАХРЕНА ты типизацию пихаешь во временную табличку ?!!! Выкинь к едрени фени всю типизацию оттуда и всё заработает:
| $регПартииТов.Фирма Фирма -- Никогда не пихай типизацию во временные таблички или в union и т.п as [Фирма $Справочник.Фирмы]
| , $регПартииТов.Товар Товар --as [Товар $Справочник.Номенклатура]
| ,$регПартииТов.ПрихДокумент Документ -- as [Документ $Документ] -- не пашет :(
| ,$регПартииТов.ПрихДокумент as docum_pr
| , -$дсОтчетР.Количество as Количество
| , -$дсОтчетР.Сумма as Сумма
| , CAST(LEFT(жОбщий.Date_Time_IDDoc, 8) as DateTime) as Дата
| INTO #ВосстановленныеТовары
Цитата: Ёпрст от 08 апреля 2024, 09:04НАХРЕНА ты типизацию пихаешь во временную табличку ?!!! Выкинь к едрени фени всю типизацию оттуда и всё заработает:
Это предварительный код, в основном пригладил.
Так что в итоге-то? работает "ПолеСКирилицей" или нет?
Я не уловил превращение анамнеза
Цитата: trad от 08 апреля 2024, 11:51Так что в итоге-то? работает "ПолеСКирилицей" или нет?
Я не уловил превращение анамнеза
Работает. Просто код типа ", $регПартииТов.Товар as [Товар $Справочник.Номенклатура]" дает во временной таблице колонку и именем "[Товар $Справочник.Номенклатура]".
Цитата: Ёпрст от 08 апреля 2024, 09:04Ёпта... линейкой бы металлической за такой код (забыл добавить, по пальчикам! )
НАХРЕНА ты типизацию пихаешь во временную табличку ?!!! Выкинь к едрени фени всю типизацию оттуда и всё заработает:
Да, я тоже прошёлся по этим граблям. И — по моим наблюдениям — новички, в основном, прут именно по ним. На начальном этапе сразу не хватает элементарной базы: что там унутре лежит, как оно барюкает и чего эта типизация делает в принципе. Самообразование, оно такое... несистемное.
Вообще вместо таких INTO можно использовать CTE.
with ВосстановленныеТовары as (
select
...
from
...
)
-- Основной запрос
select
...
from
ВосстановленныеТовары
Их можно их делать много.
Очень сильно упрощает понимание вместо вложенных запросов.
Получается что-то типа функций в коде
with ВосстановленныеТовары as (
select
...
from
...
)
, ЕщеТовары as (
select
...
from
...
)
-- Основной запрос
select
...
from
ВосстановленныеТовары
join ЕщеТовары on ....
Цитата: Sserj от 28 мая 2024, 07:17Вообще вместо таких INTO можно использовать CTE.
Обычно временная таблица используется, когда потом апдейт этих промежуточных данных нужен.
Был вопрос или решение следующего вопроса?
Событие тп_ПриИзмененииШириныКолонки(тп) не дает узнать имя колонки, ширину которой по данному событию меняют.
Можно узнать имя АКТИВНОЙ колонки, но активная и изменяемая колонки не обязаны совпадать.
До кучи: есть события тп_ПриПеремещенииКолонки() и тп_ПриИзмененииВидимостиКолонки().
Но мне не хватило отсутствующих событий тп_ПослеПеремещенииКолонки() и тп_ПослеИзмененииВидимостиКолонки().
Но тут удалось выкрутиться через "ложное" закрытие формы.
В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки. Поэтому нельзя сказать что изменяется одна конкретная колонка.
Можно хранить ширины всех колонок и, при изменении ширины, сравнивать у каких колонок ширина изменилась
Цитата: trad от 10 июля 2024, 08:37В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки.
Вот оно что... Не подумал, что ширина остальных колонок меняется.
Но всё равно знать колонку, которую меняют, имеет смысл, т.к. ее ширину надо сохранить, а остальные колонки получают свою ширину по автоматическому распределению.
При повторном открытии формы, восстанавливаем из сохраненных настроек ширину измененной ранее колонки, ширина остальных установится также автоматически.
В целом идея была такая, но поскольку не удалось отловить имя колонки - "инициатора" изменений, то пришлось тупо сохранять ширИны всех колонок из тп.
Есть у меня такой КОП
Сохраняет/восстанавливает ширину, видимость, положение колонок
// КОП_ТабличноеПолеСериализуемое.ert
//defcls.prm:
//#класс ТабличноеПолеСериализуемое=КОП_ТабличноеПолеСериализуемое.ert : ТабличноеПоле
//#{
//#};
//Базовый класс для сериализуемых табличных полей
Перем мИдентификатор;
Перем мСериализоватьПриУничтожении;
Функция Сам(Конт)
Возврат Конт;
КонецФункции
//*******************************************
Процедура Сериализовать(Режим)
ТП = Сам(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
ИмяФайла = КаталогПользователя() + "_ТП_" + мИдентификатор + ".tfs";
Если Режим = 0 Тогда
// Чтение
Сп = "";
ЗначениеИзФайла(ИмяФайла, Сп, 1);
Если ПустоеЗначение(Сп) = 0 Тогда
ИмяКолонки = "";
Индекс = 0;
Для Тек = 1 По Сп.РазмерСписка() Цикл
СпКолонка = Сп.ПолучитьЗначение(Тек,ИмяКолонки);
Попытка
Колонка = ТП.Колонки.Получить(ИмяКолонки);
Исключение
Колонка = "";
КонецПопытки;
Если ПустоеЗначение(Колонка) = 0 Тогда
Колонка.Видимость = СпКолонка.Получить("Видимость");
Колонка.Ширина = СпКолонка.Получить("Ширина");
ИндексВТП = ТП.Колонки.Индекс(Колонка);
Если Индекс <> ИндексВТП Тогда
ТП.Колонки.Сдвинуть(ИндексВТП, Индекс - ИндексВТП);
КонецЕсли;
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
// Запись
Сп = СоздатьОбъект("СписокЗначений");
Для Тек = 1 По ТП.Колонки.Количество() Цикл
Колонка = ТП.Колонки.Получить(Тек - 1);
СпКолонка = СоздатьОбъект("СписокЗначений");
Сп.ДобавитьЗначение(СпКолонка, Колонка.Имя);
СпКолонка.Установить("Видимость", Колонка.Видимость);
СпКолонка.Установить("Ширина", Колонка.Ширина );
КонецЦикла;
ЗначениеВФайл(ИмяФайла, Сп, 1);
КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура ПриУничтожении() Экспорт
Если мСериализоватьПриУничтожении = 1 Тогда
Сериализовать(1);
КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура Сериализация(Идентификатор) Экспорт
Если ПустаяСтрока(Идентификатор) = 0 Тогда
мИдентификатор = Идентификатор;
Сериализовать(0);
мСериализоватьПриУничтожении = 1;
КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура Конструктор()
мСериализоватьПриУничтожении=0;
КонецПроцедуры
Использование:
Процедура ФормаПриСоздании(_Форма)
ТП = _Форма.СоздатьЭлементУправления("ТабличноеПолеСериализуемое", Форма.ТП);
// Добавление колонок
ТП.Сериализация("Контрагенты_Список");
КонецПроцедуры
Похожее я тоже сделал, но без КОПов ;)
При чтении настроек:
Настройки = ВосстановитьЗначение("Настройки_АРМотгрузки");
Если ТипЗначенияСтр(Настройки) <> "СписокЗначений" Тогда
Настройки = СоздатьОбъект("СписокЗначений");
КонецЕсли;
НастройкиТП = Настройки.Получить(идОбъекта);
Если ТипЗначенияСтр(НастройкиТП) = "СписокЗначений" Тогда
Для поз = 1 по НастройкиТП.РазмерСписка() Цикл
Ширина = Число(НастройкиТП.ПолучитьЗначение(поз, ИмяКолонки));
инд = Колонки.Индекс(ИмяКолонки);
Если инд = -1 Тогда
Продолжить; //нет этой колонки в тп
ИначеЕсли инд+1 <> поз Тогда //нужно сдвинуть колонку
Попытка
Колонки.Сдвинуть(инд, поз-инд-1)
Исключение
КонецПопытки;
КонецЕсли;
Если Ширина = -1 Тогда //признак невидимости колонки
Колонки.Получить(ИмяКолонки).Видимость = 0
ИначеЕсли Ширина > 0 Тогда //изменим ширину
Колонки.Получить(ИмяКолонки).Ширина = Ширина;
СпИзмШириныКолонокТпЖурнал.Установить(ИмяКолонки, 1);
КонецЕсли;
КонецЦикла;
КонецЕсли;
При записи настроек:
НастройкиТП = СоздатьОбъект("СписокЗначений");
Колонки = тпЖурнал.Колонки;
Для инд = 0 По Колонки.Количество()-1 Цикл
Колонка = Колонки.Получить(инд);
//НастройкиТП.Установить(Колонка.Имя, ?(Колонка.Видимость=0, -1, ?(СпИзмШириныКолонокТпЖурнал.Получить(Колонка.Имя)=1,Колонка.Ширина,0)));
НастройкиТП.Установить(Колонка.Имя, ?(Колонка.Видимость=0, -1, Колонка.Ширина));
КонецЦикла;
Настройки.Установить("тпЖурнал_", НастройкиТП);
СохранитьЗначение("Настройки_АРМотгрузки", Настройки);
Сохраняет/восстанавливает ширину, видимость и положение колонок.