The easiest way is to first set, for each group, the first row to all 0's. Then, add 1 to each column. This is equivalent of what you're wishing to do. Here's how I'd do it:
setkey(DT, id1)
DT[J(unique(id1)), c(cnames) := list(0L), mult="first"]
DT[, c(cnames) := .SD+1L, .SDcols=cnames]
# id1 id2 c1 c2 c3
# 1: 1 1 1 1 1
# 2: 1 2 2 1 3
# 3: 1 3 1 2 3
# 4: 2 1 1 1 1
# 5: 2 2 2 3 2
# 6: 2 3 3 4 2
Following OP's comment and edit to the question:
You can accomplish this as follows: First shift the rows by 1 column while replacing first column by 0's and then add 1 to all the columns.
DT[, c(cnames) := lapply(.SD, function(x)
c(0L, head(x, -1L))), by=id1, .SDcols=cnames]
DT[, c(cnames) := .SD+1L, .SDcols=cnames]
> DT
# id1 id2 c1 c2 c3
# 1: 1 1 1 1 1
# 2: 1 2 1 1 2
# 3: 1 3 2 1 3
# 4: 2 1 1 1 1
# 5: 2 2 3 2 2
# 6: 2 3 2 3 2
Another variation by looking at the question in your comment:
First shift the entire data by 1 row, without grouping, and add 1 to it. Then, set first row for each group to all 1's.
setkey(DT, id1)
DT[2:nrow(DT), c(cnames) := head(DT[, ..cnames], -1L) + 1L]
DT[J(unique(id1)), c(cnames) := list(1L), mult="first"]